2013-09-27 146 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沒有任何關係