微调器,为什么返回不同的间隙和错误的值

Spinners, why different gap and wrong values returned

问题:我有两个具有不同值的微调器。但是,在模拟器或应用程序中观看它们时,它们在屏幕上显示的项目之间有不同的 "gap"。当我尝试将值从我的 activity 发送到另一个时,我总是得到错误的微调器 1 值。

微调器 1:

微调器 2:

字符串数组:

    <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();
}

按钮将值传递给下一个 activity:

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 是全局 "private static 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>

问题注册。 setOnItemSelectedListener

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

选项 1

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

例如,您可以在对 setOnItemSelectedListener 的每个调用中使用新的 AdapterView.OnItemSelectedListener,类似于您对 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 的等效部分使用相同的块,编译器会在应该使用 adapter2 时意外使用 adapter 时报错。