微调器,为什么返回不同的间隙和错误的值
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
时报错。
问题:我有两个具有不同值的微调器。但是,在模拟器或应用程序中观看它们时,它们在屏幕上显示的项目之间有不同的 "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
时报错。