#java #android #android-spinner
#java #Android #android-spinner
Вопрос:
Я создаю небольшое приложение для преобразования единиц измерения, в котором используются два блесны, позволяющие выбирать значение из значения и значение в значение. Два блесны используют один и тот же адаптер и один и тот же массив строк в strings.xml . Как мне разрешить выбирать блесны по отдельности при одновременном сохранении выбранных значений в двух отдельных переменных?
Я пытался использовать оператор and if и переключатель, но они являются условными и управляющими операторами, которые, похоже, не решают проблему. Блесны могут быть выбраны индивидуально, чего я и хочу. Однако я не мог понять, как передать переменные, содержащие значения, из метода.
Я также пробовал вызывать метод getSelectedItem() для обеих переменных, однако не похоже, что метод может различать блесны таким образом. Помимо этого, он работает почти так, как я предполагал, переменные содержат выбранное значение блесны.
Мне также пришлось установить положение блесны с помощью этого setSelection() из-за того, что блесны были нулевыми при запуске и сбой приложения.
Адаптер с блеснами: переменные spinnerFrom и spinnerTo являются глобальными.
spinnerFrom = (Spinner) findViewById(R.id.spinnerDropdown);
spinnerTo = (Spinner) findViewById(R.id.spinnerDropdown2);
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this,
R.array.velocity_array, android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_item);
spinnerFrom.setAdapter(adapter);
spinnerTo.setAdapter(adapter);
spinnerFrom.setOnItemSelectedListener(this);
spinnerTo.setOnItemSelectedListener(this);
If-оператор (первая попытка)
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id)
{
if(parent.getId() == R.id.spinnerDropdown)
{
spinner1 = Integer.parseInt(parent.getItemAtPosition(position).toString());
}
else if(parent.getId() == R.id.spinnerDropdown2)
{
spinner2 = Integer.parseInt(parent.getItemAtPosition(position).toString());
}
}
getSelectedItem()(вторая попытка)
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id)
{
spinnerFrom.setSelection(position);
spinnerTo.setSelection(position);
String values = "Spinner 1: " spinnerFrom.getSelectedItem().toString()
"nSpinner 2: " spinnerTo.getSelectedItem().toString();
resultDisplay.setText(values);
}
Обновление: текущий код
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
if(parent.getId() == R.id.spinnerDropdown)
{
spinner1 =(xmlArray[position]);
}
else if(parent.getId() == R.id.spinnerDropdown2)
{
spinner2 =(xmlArray[position]);
}
convertUnits(spinner1, spinner2); <-- Line 82
public void convertUnits(String spinner1, String spinner2)
{
if(spinner1.contains("Double") amp;amp; spinner2.contains("Triple")) <-- Line 95
{
//conversion method
}
...
java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.String.contains(java.lang.CharSequence)' on a null object reference
at com.example.courseproject.Velocity.convertUnits(Velocity.java:95)
at com.example.courseproject.Velocity.onItemSelected(Velocity.java:82)
Редактировать: блесны работают, но это была моя первоначальная проблема с использованием условного оператора if. Переменная spinner2 равна нулю, и мое приложение выходит из строя. Мне нужны обе переменные.
Я пробовал как .equals, так и .contains, ни один из них не разрешает указатель nullpointer.
Редактирование 2: я не могу скопировать / вставить то, что показывает мне отладчик, но в строке 95 spinner2 отображается как «null». Также похоже, что значение spinner2 никогда не изменяется от начального null в любом месте кода, в то время как spinner1 это делает.
Ответ №1:
Следуйте приведенному ниже коду для лучшего просмотра, чтобы решить вашу проблему:
public class MainActivity extends AppCompatActivity implements
AdapterView.OnItemSelectedListener {
Spinner spinnerFrom,spinnerTo;
String[] menuArray;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView textView=findViewById(R.id.text);
spinnerFrom = (Spinner) findViewById(R.id.spinnerDropdown);
spinnerTo = (Spinner) findViewById(R.id.spinnerDropdown2);
menuArray = getResources().getStringArray(R.array.velocity_array);
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this,
R.array.velocity_array, android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_item);
spinnerFrom.setAdapter(adapter);
spinnerTo.setAdapter(adapter);
spinnerFrom.setOnItemSelectedListener(this);
spinnerTo.setOnItemSelectedListener(this);
}
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id)
{
if(parent.getId() == R.id.spinnerDropdown)
{
int spinner1 = Integer.parseInt(menuArray[position]);
}
else if(parent.getId() == R.id.spinnerDropdown2)
{
int spinner2 = Integer.parseInt(menuArray[position]);
}
}
@Override
public void onNothingSelected(AdapterView<?> adapterView) {
}
}
<string-array name="velocity_array">
<item>1</item>
<item>2</item>
<item>3</item>
<item>4</item>
</string-array>
Комментарии:
1. Я вроде понимаю, что вы делаете, но могу я спросить, почему вы сохранили массив строк в переменную и оперировали с этим?
2. Я попробовал этот код, и он не решает мою проблему, потому что spinner2 имеет значение null, когда я пытаюсь передать обе переменные, что приводит к сбою моего приложения. Есть ли другой способ?
3. вы используете один адаптер для обоих блесен, так как возможно исключение nullpointer, поскольку счетчик работает нормально
4. Я думаю, что это как-то связано с if-оператором. Я запустил отладчик, и после того, как я передал spinner1 и spinner2 другому методу, spinner2 отображался как null. Я отредактирую свое обновление с дополнительной информацией.