TextView不会随OnItemSelectedListener而改变

时间:2013-09-27 07:16:30

标签: java android

简单地说,我创造了一个微调器。我的array.xml中有微调条目和条目值。

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

    <string-array name="select">
        <item>a</item>
        <item>b</item>
        <item>c</item>
    </string-array>

    <integer-array name="selectValues">
        <item>1</item>
        <item>2</item>
        <item>3</item>
    </integer-array>

</resources>

这是我的linearlayout

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" 
    android:id="@+id/selectLayout"
    >

    <TextView
        android:id="@+id/tvSelect"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:text="@string/select"
        android:textSize="18sp"
        android:layout_gravity="center"
         />

    <Spinner
        android:id="@+id/sSelect"
        android:layout_width="179dp"
        android:layout_height="60dp"
        android:layout_gravity="center"
        android:entries="@array/select"
        android:prompt="@string/sec"
        android:spinnerMode="dialog"
         />

</LinearLayout>

在我的活动中,我创建了OnItemSelectedListener,当用户选择的项目我要更改TextView时。我认为使用开关时存在问题。

这是活动。

public class Select extends Activity implements OnItemSelectedListener{

    int[] itemValues;
    TextView t;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);

        Resources rsc = getResources();
        itemValues = rsc.getIntArray(R.array.selectValues);
        t = (TextView) findViewById(R.id.tvSelect);

        setContentView(R.layout.select);

        Spinner form = (Spinner) findViewById(R.id.sSelect);
        form.setOnItemSelectedListener(this);
    }

    @Override
    public void onItemSelected(AdapterView<?> item, View which, int sort,
            long arg3) {
        // TODO Auto-generated method stub

        switch(which.getId())
        {
        case R.id.sSelect:
            int value = itemValues[sort];
            t.setText(value);
            break;
        }

    }

    @Override
    public void onNothingSelected(AdapterView<?> arg0) {
        // TODO Auto-generated method stub

    }



}

如何解决这个问题?

编辑:当我尝试删除切换时,我收到unfortunately has stopped错误。

9 个答案:

答案 0 :(得分:1)

  1. 正如Spring Breaker所说,你需要在致电setContentView()之前致电findViewById()。如果您先致电findViewById(),它将返回null,并且您在尝试使用NullPointerException时获得TextView

  2. onItemSelected()中,which实际上并不是对Spinner的引用。它是对Spinner的子视图的引用,它包含用户按下的特定项。您需要切换第一个参数AdapterView<?>

  3. setText()要求Stringint资源值引用XML字符串。您传递的是int,但不是资源值,因此无效。这是一个快速的解决方法:

    String value = String.valueOf(itemValues[position]);
    t.setText(value);
    

答案 1 :(得分:0)

which.getId()返回在微调器中选择的项的id,而不是微调器的ID,R.id.sSelect是微调器的id

答案 2 :(得分:0)

这样做..

    form.setOnItemSelectedListener(new OnItemSelectedListener() {

        @Override
        public void onItemSelected(AdapterView<?> arg0, View arg1,
                int sort, long arg3) {
                int value = itemValues[sort];
                t.setText(value);
        }
    });

答案 3 :(得分:0)

在定义视图之前使用setcontentview()方法

即。在这一行之前 - &gt; t =(TextView)findViewById(R.id.tvSelect);

答案 4 :(得分:0)

在引用布局文件中的任何ID之前,您必须使用setContentView(R.layout.select);。在您的情况下,onCreate()应如下所示,

    @Override
        protected void onCreate(Bundle savedInstanceState) {
            // TODO Auto-generated method stub
            super.onCreate(savedInstanceState);

            setContentView(R.layout.select);

            Resources rsc = getResources();
            itemValues = rsc.getIntArray(R.array.selectValues);
            t = (TextView) findViewById(R.id.tvSelect);                  
            Spinner form = (Spinner) findViewById(R.id.sSelect);
            form.setOnItemSelectedListener(this);
        }
 @Override
        public void onItemSelected(AdapterView<?> item, View which, int sort,
                long arg3) {


             String  SpinerValue3 = item.getItemAtPosition(sort).toString();
             t.setText(SpinerValue3);
        }

答案 5 :(得分:0)

switch(which.getId())
        {
        case R.id.sSelect:
            t.setText(form.getselecteditem().tostring());
            break;
        }

答案 6 :(得分:0)

尝试使用t.setText(String.valueOf(value));

可能正常工作并在textview

之前设置contentview

答案 7 :(得分:0)

将您的switch语句更改为以下代码。

        switch(sort)
        {
            case 0:
                int value = itemValues[0];
                t.setText(value);
                break;
            case 1:
                int value = itemValues[1];
                t.setText(value);
                break;
        }

答案 8 :(得分:0)

我有类似的问题。我通过实现内联侦听器并调用特定函数来解决这个问题。从调试器我了解到发送的id与spinner id

无关