【问题标题】:Android spinner is getting null after rotating the screen旋转屏幕后,Android微调器变空
【发布时间】:2016-08-05 18:17:33
【问题描述】:

我正在使用微调器将值显示为下拉列表,我正在使用以下代码更改微调器文本值

<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。

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

请给我适当的解决方案。

谢谢

【问题讨论】:

  • 返回 null 的 getChildAt() 还是 Spinner 本身是 null?
  • 只有 arg0.getChildAt(0) 在旋转屏幕时变为空
  • 这里有一个对我有帮助的类似问题:stackoverflow.com/questions/20830606/…

标签: android null android-spinner


【解决方案1】:

当您在View arg1 中有适当的视图时,为什么还要使用getChildAt?

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

要更改微调器中选定文本的颜色,最好使用选择器。

spinner_state.xml(在可绘制文件夹中)

<?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>

在您的微调器中,应用选择器:

    android:dropDownSelector="@drawable/spinner_state"

Spinner 来源:Spinner does not apply dropDownSelector attribute

它没有解释为什么你的值在 onItemSelected 中为空,但没有你的完整代码,我看不出有什么问题。

【讨论】:

  • 但同样的问题是在旋转屏幕时得到 arg1 为空
  • 我刚刚在 XML 中声明了一个微调器并在活动中初始化,我的要求是在微调器视图中更改选择微调器文本颜色,我们可以使用上面的代码或 (((TextView) arg0.getChildAt(0)).setTextColor(Color.WHITE)) 当我进入屏幕时它工作正常但是当我旋转屏幕时((TextView)arg0.getChildAt(0) 为空意味着 arg0.getChildCount() 将为零
  • 我已经编辑了我的问题,请看上面,我不仅改变颜色还改变大小,重力等不能使用你上面的代码。感谢您的支持
  • 请展示整个活动,看看您如何处理轮换。
【解决方案2】:

我遇到了同样的问题,所以我将 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)        
}

希望它也对你有用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 2015-08-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多