【问题标题】:Get last selected Spinner value before change获取更改前最后选择的 Spinner 值
【发布时间】:2016-03-06 20:32:22
【问题描述】:

我有一个微调器,当我单击微调器时(基本上就在显示列表中的项目之前),我想获取它最后选择的值。

我怎样才能做到这一点?

更新: 示例:存在动态数量的微调器。用户点击微调器 1 并选择一个值,比如说“房子”。然后点击其他地方。然后再次单击微调器 1。我现在需要的是返回在用户选择不同的值之前选择的值“house”,即该微调器中的“car”。我不能使用本地存储预先保存该值,因为它将是要添加的动态数量的微调器。

是的,我确实已经阅读了http://developer.android.com/guide/topics/ui/controls/spinner.html 的文档,但那里没有解释我需要的内容。

【问题讨论】:

  • 你有没有特别尝试过什么?
  • 我尝试了一个崩溃的 OnClickListener。我也试过 OnClick,同样的问题。我已经在使用 setOnItemSelectedListener() 但这会给我新选择的值而不是以前的值b

标签: android android-spinner


【解决方案1】:

也许您可以声明一个字符串数组,然后使用它来存储项目值。在 TextView 中显示它是一种查看它是否有效的方法。

类似这样的:

public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2,
        long arg3) {
    selection.setText(items[arg2]);

}

我已经遇到过类似的情况,但我不记得具体是如何解决的。告诉我,如果它给你一个更好的主意,我是新来的。

【讨论】:

  • 感谢您的提示。它不适用于字符串数组。但是,我想出了一种方法来使它工作。将回答我自己的问题。
【解决方案2】:
Spinner mySpinner=(Spinner) findViewById(R.id.your_spinner);
String text = mySpinner.getSelectedItem().toString();

当用户从下拉列表中选择一个项目时,Spinner 对象 接收项目选择事件。

要为微调器定义选择事件处理程序,请实现 AdapterView.OnItemSelectedListener 接口及对应 onItemSelected() 回调方法。例如,这里有一个 在 Activity 中实现接口:

public class SpinnerActivity extends Activity implements OnItemSelectedListener {
    ...

    public void onItemSelected(AdapterView<?> parent, View view, 
            int pos, long id) {
        // An item was selected. You can retrieve the selected item using
        // parent.getItemAtPosition(pos)
    }

    public void onNothingSelected(AdapterView<?> parent) {
        // Another interface callback
    }
}

AdapterView.OnItemSelectedListener 需要 onItemSelected() 和 onNothingSelected() 回调方法。

然后需要通过调用来指定接口实现 setOnItemSelectedListener():

Spinner spinner = (Spinner) findViewById(R.id.spinner);
spinner.setOnItemSelectedListener(this);

在您的情况下:

如果用户点击了微调器,请执行以下操作:

     if (spin.getSelectedItemPosition() < 0) {
    Spinner mySpinner=(Spinner) findViewById(R.id.your_spinner);
    String text = mySpinner.getSelectedItem().toString();

}

这意味着用户点击了微调器,但没有点击它的任何项目。

再次编辑

 public class SpinnerActivity extends Activity implements OnItemSelectedListener {
>         ...
>         
>         public void onItemSelected(AdapterView<?> parent, View view, 
>                 int pos, long id) {
>              parent.getItemAtPosition(pos) //THIS GETS YOU THAT VALUE THAT THE USER CLICKED ON DYNAMICALLY
>         }
>     
>         public void onNothingSelected(AdapterView<?> parent) {
>             // Another interface callback
>         }
>     }

http://developer.android.com/guide/topics/ui/controls/spinner.html

【讨论】:

  • 我需要在单击微调器时正确获取值。不在之前或任何其他时间。我已经知道我可以像这样获取当前选择的值。
  • @e-nature 好的,我已经对其进行了编辑,以向您展示如何在用户单击微调器时获取。让我知道它是否在评论中有效
  • 我取消了反对票,抱歉;)但这不是我需要的。假设用户从微调器中选择了“House”,然后再次单击同一个微调器(微调器的数量是动态的),我需要在单击微调器期间立即获取该“House”值。问题是我有一个动态数量的微调器(以程序方式添加),只要用户点击“添加电子邮件地址”,就会添加这些微调器。
  • 嗯现在确定我是否可以按照您的解决方案跟随您。我必须在哪里添加if (spin.getSelectedItemPosition() &lt; 0) {...?我想在某个地方我可能需要 OnClick() 事件或类似事件,不是吗?
  • @e-nature 好的,我会再次编辑。让我知道它是否符合您的需求。
【解决方案3】:

解决方案是为每个添加的 Spinner 添加一个 TextView 小部件。将 TextView 设置为“消失”(不可见)。当微调器更改时,将值设置为该 TextView。这样,您可以将最后选择的微调器值存储在 TextView 中。当用户单击微调器并更改值时,您仍然可以通过 TextView 小部件从微调器访问先前选择/未选择的值。

// Use this TextView to temporarily store the spinner value
final TextView hiddenTextView = new TextView(getContext());
hiddenTextView.setVisibility(View.GONE);

final Spinner spinner = new Spinner(getContext());
spinner.setPrompt(getString(R.string.email_other));

ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(getContext(), R.array.email_types, android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(adapter);

spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) {

            Log.d(TAG, "TextView Value before spinner change: " + hiddenTextView.getText());

            String spinnerValue = String.valueOf(spinner.getSelectedItem());

            hiddenTextView.setText(spinnerValue);
            Log.d(TAG, "TextView Value after spinner change: " + hiddenTextView.getText());
        }

        @Override
        public void onNothingSelected(AdapterView<?> parentView) {
            return;
        }

    });

【讨论】:

  • 您不必为此声明另一个View,我认为View 类的setTag() 方法就是为此目的。你可以简单地使用setTag()将该文本/对象添加到微调器视图,并使用getTag()获取该文本。
猜你喜欢
  • 2022-01-22
  • 2021-12-16
  • 2011-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-12
  • 1970-01-01
相关资源
最近更新 更多