2013-09-27 84 views
1

简而言之,我创建了一个微调框。我的array.xml中存在微调项和值条目。TextView不会随OnItemSelectedListener更改

<?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错误。

+0

您是否检查过setText方法是否被调用?也许一个简单的if语句在这里比较容易(同样,如果你只是为一个spinner设置监听器,就不需要检查视图的id) –

+0

我正在编程学习。我也检查了。此外,当我删除开关,我不幸错误。 –

+0

R.id.sSelect是什么? –

回答

0

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

+0

那么如何验证微调器的ID? –

0

做到这一点的方式..

form.setOnItemSelectedListener(new OnItemSelectedListener() { 

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

使用工具有没有办法? –

0

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

即在此行之前 - > t =(TextView)findViewById(R.id.tvSelect);

+0

没有什么变化。 –

0

你必须从布局file.In的情况下引用任何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); 
     } 
+0

真的没有改变。我认为应用不会进入交换机内部? –

+0

@ user2709178:看到我编辑的答案。 –

+0

但是,你正在获得的位置,如果值是字符串或不同的东西会是什么? –

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

我想你不明白我在问什么,我试着做什么:) –

+0

你在textview中设置int。 int value = itemValues [sort]; t.setText(value);先将**值**解析为字符串 –

+0

那是不会改变任何东西的。 –

0

与t.setText(将String.valueOf(试试吧值));

可能是工作和TextView的

+0

尝试过,没有任何变化。 –

0
之前设定的内容查看

switch声明更改为下面的代码。

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

不幸的是,AppFit已经停止:( –

+0

这里发布logcat –

+0

http://pastebin.com/uETQfyM5 –

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

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

  3. setText()期望引用XML字符串的Stringint资源值。你传递给它一个int,但不是资源值,所以它不起作用。这里有一个快速的解决方法:

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

顺便说一句,一个简单的方法来调试这样的问题是添加“断点”然后点击你的IDE中的'Debug'(而不是'Run')。在你的情况下,在'onItemSelected()'的开头添加一个断点会告诉你哪个参数是'Spinner',并且你的“TextView”变量为空。 – cnnr

0

我也有类似的问题。我通过实现内联监听器并调用特定的函数来解决此问题。从调试器中,我了解到发送的ID与微调ID没有任何关系