Android屏幕旋转后,Spinner控件变成了空值。

3
我正在使用下拉框来显示值,我通过以下代码更改下拉框文本值:
<Spinner
        android:id="@+id/showUnit"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:gravity="center"
        android:entries="@array/unitName"
        android:background="@drawable/gradient_spinner_map_miles_button" />

    showUnit.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {

            @Override
            public void onItemSelected(AdapterView<?> arg0, View arg1,
                    int arg2, long arg3) {
                // TODO Auto-generated method stub
                String item = arg0.getItemAtPosition(arg2).toString();
                if (arg1 != null && arg1 instanceof TextView) {
                     ((TextView)arg1).setTextColor(Color.WHITE);
                    ((TextView) arg1).setTextSize(13);
                    ((TextView) arg1).setGravity(Gravity.CENTER);
                 }

}

showUnit = (Spinner) findViewById(R.id.showUnit);

但是,当我尝试旋转屏幕时,((TextView)arg0.getChildAt(0)) 返回 null。

我知道当我在横向或纵向模式下旋转屏幕时,活动周期会重新启动,那么为什么 Spinner 会变为空呢?

请给出适当的解决方案。

谢谢。


3
µİ»getChildAt()×┐öÕøŞõ║ånull×┐ݵݻSpinnerµ£¼×║½õ©║null´╝ş - Piotr Chojnacki
旋转屏幕时,仅arg0.getChildAt(0)获取null。 - user2828418
1
这里有一个类似的问题帮助了我:https://dev59.com/33rZa4cB1Zd3GeqP6Lta - Rock Lee
2个回答

2

你为什么要使用getChildAt,当你已经有适当的视图在View arg1中了呢?

public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) 
{           
     if (arg1 != null && arg1 instanceof TextView) {
         ((TextView)arg1).setTextColor(Color.WHITE);
     }
}

在 Spinner 中改变所选文本的颜色最佳实践是使用选择器。

spinner_state.xml(位于 drawable 文件夹中)

<?xml version="1.0" encoding="utf-8"?>

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:state_enabled="false"
        android:drawable="@color/black" />
    <item
        android:state_pressed="true"
        android:state_enabled="true"
        android:drawable="@color/red" />
    <item
        android:state_focused="true"
        android:state_enabled="true"
        android:drawable="@color/red" />
    <item
        android:state_enabled="true"
        android:drawable="@color/gray" />
</selector>

在您的Spinner中,应用选择器:
    android:dropDownSelector="@drawable/spinner_state"

来源于Spinner:Spinner does not apply dropDownSelector attribute

它并没有解释为什么你的onItemSelected中的值为空,但是没有你的完整代码我无法看出问题在哪里。


但是在旋转屏幕时出现了相同的问题,得到的 arg1 为空。 - user2828418
我刚在 XML 中声明了一个 spinner 并在 activity 中进行了初始化,我的要求是更改 spinner 视图中所选 spinner 文本的颜色,我们可以使用上述代码或者 ( ((TextView)arg0.getChildAt(0)).setTextColor(Color.WHITE)) 更改 spinner 文本颜色,当我进入屏幕时它完美地运行,但是当我旋转屏幕时((TextView)arg0.getChildAt(0) 为空,这意味着 arg0.getChildCount() 返回为零。 - user2828418
我已经编辑了我的问题,请参见上文,我不仅改变了颜色,还改变了大小、重力等等。不能使用你上面的代码。感谢你的支持。 - user2828418
请展示整个活动以查看您如何处理旋转。 - Andros

1

我遇到了同样的问题,所以我将setTextColor移动到了getView中:

ArrayAdapter<CharSequence> adapter =
    new ArrayAdapter<CharSequence>(this, android.R.layout.simple_spinner_item, getResources().getTextArray(R.array.myarray)){
        @Override
        public View getDropDownView(int position, View convertView, ViewGroup parent){
            View v = null;
            System.out.println("getDropDownView");
            v = super.getDropDownView(position, null, parent);
            // If this is the selected item position
            if (position == PosItemSelected) {
                v.setBackgroundColor(getResources().getColor(R.color.orange_energicod));
            }
            else {
                // for other views
                v.setBackgroundColor(Color.WHITE);
            }
            return v;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            View v = super.getView(position, convertView, parent);                     
            ((TextView) v).setTextColor(getResources().getColor(R.color.white));
            return v;
        }
    };

// Specify the layout to use when the list of choices appears
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
// Apply the adapter to the spinner
spinner.setAdapter(adapter); // set the adapter to provide layout of rows and content
spinner.setOnItemSelectedListener(this); // set the listener, to perform actions based on item selection

现在:

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

希望这对你也有用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接