纺纱机,为什么会有不同的间隙和错误的数值返回?

问题描述 投票:0回答:1

问题:我有两个旋转器,它们的数值不同。然而,当在模拟器或应用程序中观察它们时,它们在屏幕上显示的项目之间都有不同的 "间隙"。当我试图将数值从我的活动中发送到另一个活动时,我总是得到错误的数值给旋转器1。

微调器1:enter image description here

Spinner 2:enter image description here

字符串数组

    <string-array name="lage">
    <item>--Välj läge--</item>
    <item>Kök</item>
    <item>Badrum</item>
    <item>Hall</item>
    <item>Garderob</item>
    <item>Balkong</item>
    <item>Sovrum</item>
    <item>Vardagsrum</item>
    <item>Förråd</item>
    <item>Allmäna utrymmen</item>
    <item>Övrigt</item>
</string-array>

<string-array name="Fel">
    <item>--Välj läge--</item>
    <item>Vattenläcka</item>
    <item>Ventilation</item>
    <item>Fönster</item>
    <item>Avlopp</item>
    <item>Elfel</item>
    <item>Vitvaror</item>
    <item>Golv</item>
    <item>Vägg</item>
    <item>Övrigt</item>
</string-array>

实现简单的下拉项目的微调器适配器。

        ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this,R.array.lage,android.R.layout.simple_spinner_item);
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    spinner1.setAdapter(adapter);
    spinner1.setOnItemSelectedListener(this);

    ArrayAdapter<CharSequence> adapter2 = ArrayAdapter.createFromResource(this,R.array.Fel,android.R.layout.simple_spinner_item);
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    spinner2.setAdapter(adapter2);
    spinner2.setOnItemSelectedListener(this);

    @Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
    input1 = spinner1.getItemAtPosition(position).toString();
    input2 = spinner2.getItemAtPosition(position).toString();
}

按钮将数值传递给下一个活动

buttonNasta.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(getBaseContext(), step2Fel.class);
            intent.putExtra("testX", input1);
            intent.putExtra("testY",input2);
            startActivity(intent);
        }
    });

输入1和2是全局的 "私有静态String "值。

Layout.xml。

<LinearLayout
    android:id="@+id/xxx"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:layout_weight="7"
    android:orientation="vertical"
    android:background="@android:color/white">

    <TextView
        android:id="@+id/textView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Located?"
        android:paddingLeft="5dp"
        android:paddingTop="5dp"
        android:textSize="18sp" />

    <Spinner
        android:id="@+id/lage_spinner"
        android:layout_width="200dp"
        android:layout_height="40dp"
        android:layout_marginTop="5dp"
        android:layout_marginLeft="5dp"
        android:background="@drawable/sqare_frame" />

    <TextView
        android:id="@+id/textView3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Problem?"
        android:paddingLeft="5dp"
        android:paddingTop="5dp"
        android:textSize="18sp" />

    <Spinner
        android:id="@+id/small_spinner"
        android:layout_width="200dp"
        android:layout_height="40dp"
        android:layout_marginTop="5dp"
        android:layout_marginLeft="5dp"
        android:background="@drawable/sqare_frame" />
</LinearLayout>
java android android-studio spinner
1个回答
1
投票

问题注册。setOnItemSelectedListener

问题似乎是你使用了一个单一的实现来设置全局变量,这意味着每当选择任何一个列表中的项目时,它们都会被相同的值覆盖。

方案一

如果你使用两个独立的实现,每个实现只更新相应的变量,就我所知,它应该可以工作。

例如,你可以使用一个新的 AdapterView.OnItemSelectedListener 在每次调用 setOnItemSelectedListener,就像你用 setOnClickListener.

其中一种方式可能如下(只是一个草图,我非常喜欢教人们如何钓鱼,而不是给他们鱼:)。):

ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(
    this,
    R.array.lage,
    android.R.layout.simple_spinner_item
);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner1.setAdapter(adapter);
spinner1.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
    @Override
    public onItemSelected(...) {...}
    @Override
    public onNothingSelected(...) {...}
});

ArrayAdapter<CharSequence> adapter2 = ArrayAdapter.createFromResource(
    this,
    R.array.Fel,
    android.R.layout.simple_spinner_item
);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner2.setAdapter(adapter2);
spinner2.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
    @Override
    public onItemSelected(...) {...}
    @Override
    public onNothingSelected(...) {...}
});

方案2

另一种方法是,在你目前的 onItemSelected 的实现,因此哪个全局变量应该被更新,可能会用类似于 parent == spinner1,虽然我没有检查这个片段。

问题注册项目之间的差距

我想我现在知道是什么了,在。

ArrayAdapter<CharSequence> adapter2 = ArrayAdapter.createFromResource(
    this,
    R.array.Fel,
    android.R.layout.simple_spinner_item
);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner2.setAdapter(adapter2);

召唤... setDropDownViewResource 应是 adapter2,不 adapter. 这是一个很常见也很容易犯的错误,我用下面的方法来避免自己犯这样的错误。

{
    ArrayAdapter<CharSequence> adapter2 = ArrayAdapter.createFromResource(
        this,
        R.array.Fel,
        android.R.layout.simple_spinner_item
    );
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    spinner2.setAdapter(adapter2);
}

这样一来,局部变量 adapter2 只在其相关的范围内可用。如果您将相同的块用于等同于 adapter的时候,编译器会抱怨说不小心使用了 adapteradapter2 应使用。

© www.soinside.com 2019 - 2024. All rights reserved.