2013-09-22 101 views
3

工作在activity_main.xmlNumberPicker不帶鍵盤

NumberPicker numberPicker1 = (NumberPicker) findViewById(R.id.numberPicker1); 
numberPicker1.setMinValue(1); 
numberPicker1.setMaxValue(20); 

當我編輯用鍵盤的價值,我得到編程沒有按」價值噸改變,但如果我按+然後-它的作品。

如何在不按+-的情況下使其工作?


編輯:

我創建了MelihAltıntaş的代碼的新項目,它顯示了一個全新的numberpicker! (用手指滑動,無法輸入文字的地方)。然後我和我的真實項目進行比較,我看到了android:theme="@android:style/Theme.NoTitleBar"。我將它添加到新項目中,然後號碼選擇器成爲我習慣的號碼。

+0

我有同樣的問題,有沒有人提出一個更好的答案呢? –

回答

10

NumberPicker不是專爲互動。當您使用鍵盤更改值時,您將直接更改爲NumberPicker中的小部件,並且小部件本身不會看到此更改,因此這就是您最後存儲的值的原因。爲了解決這個問題,你需要一些哈克代碼,這並不推薦,因爲你需要訪問底層EditText(假設在首位的手機制造商並沒有改變這一點):

private EditText findInput(ViewGroup np) { 
    int count = np.getChildCount(); 
    for (int i = 0; i < count; i++) { 
     final View child = np.getChildAt(i); 
     if (child instanceof ViewGroup) { 
      findInput((ViewGroup) child); 
     } else if (child instanceof EditText) { 
      return (EditText) child; 
     } 
    } 
    return null; 
} 

,然後你會使用這個代碼來設置上發現EditText一個TextWatcher時看到它的手動修改(並讓NumberPicker瞭解這種變化):

EditText input = findInput(np);  
TextWatcher tw = new TextWatcher() { 

     @Override 
     public void onTextChanged(CharSequence s, int start, int before, 
       int count) {} 

     @Override 
     public void beforeTextChanged(CharSequence s, int start, int count, 
       int after) {} 

     @Override 
     public void afterTextChanged(Editable s) { 
       if (s.toString().length() != 0) { 
        Integer value = Integer.parseInt(s.toString()); 
        if (value >= np.getMinValue()) { 
         np.setValue(value); 
        } 
       } 
     } 
    }; 
input.addTextChangedListener(tw); 

另一種選擇是讓你的自己實現NumberPicker小部件並插入你的功能rget。

+0

你測試過了嗎?我的意思是,你確定它必須工作?因爲它會使用'Invalid int:「」'崩潰我的應用程序。 (順便說一下,我移動了'input.addTextChangedListener(tw);'到底部,因爲tw不會被定義) – Mageek

+0

@Mageek行'np.setValue(Integer.parseInt(s.toString()));'應該被包裝檢查字符串是否爲空(例如刪除所有數字時):if(s.toString()。length()== 0){np.setValue()。getMinValue(); } else {np.setValue(Integer.parseInt(s.toString()));}' – Luksprog

+0

你確定它是'np.setValue()。getMinValue();'?因爲沒有參數...(對不起,我仍然是java和android編程的初學者) – Mageek

1

您必須按Done按鈕才能以編程方式更改該值。

+0

我剛剛嘗試過,它不起作用:/ – Mageek

+0

現在我的作品,所以如果你有聽衆按下正面按鈕,如果你按清晰焦點它應該工作。在這個階段有兩個假設。爲什麼它的作用是因爲假設是你已經輸入了文本,當你在這個方法的內部實現中調用clearFocus時,將獲得該值並將其設置在內部數字選擇器edittext –

1
NumberPicker np = (NumberPicker) findViewById(R.id.numberPicker1); 
String[] nums = new String[20]; 
for(int i=0; i<nums.length; i++) 
     nums[i] = Integer.toString(i); 

np.setMinValue(1); 
np.setMaxValue(20); 
np.setWrapSelectorWheel(false); 
np.setDisplayedValues(nums); 
np.setValue(1); 
+0

我不知道爲什麼,但它仍然不起作用;( – Mageek

+0

我剛剛發現了一些非常奇怪的東西,看看我的編輯。你知道該怎麼辦? – Mageek

+0

這很奇怪android:theme =「@ android:style/Theme.Light.NoTitleBar」與狀態欄有關如果你想刪除狀態欄,然後使用它 –

10

如果有人想要一個簡單的解決方法,只需在保存該值之前添加下面的代碼即可。

numberPicker.clearFocus(); 
+0

海事組織這是最簡單的修復,最重要的是:它的工作原理。 –

+0

它的工作原理!謝謝 !! – ElOjcar

+0

你真正的MVP – mariozawa

1

我看到你已經有了答案,但這可能對別人有用。您可以擴展android.widget.NumberPicker並在您可以配置EditText的地方創建自己的。當您在軟鍵盤上輸入時,NumberPicker的值會立即設置爲您輸入的值。

public class MyNumberPicker extends android.widget.NumberPicker { 

     private EditText eText; 

     public MyNumberPicker(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     } 


     @Override 
     public void addView(View child) { 
     super.addView(child); 
     initEditText(child); 
     } 

     @Override 
     public void addView(View child, int index, android.view.ViewGroup.LayoutParams params) { 
     super.addView(child, index, params); 
     initEditText(child); 
     } 

     @Override 
     public void addView(View child, android.view.ViewGroup.LayoutParams params) { 
     super.addView(child, params); 
     initEditText(child); 
     } 

     public void initEditText(View view){ 
      if(view instanceof EditText){ 
       EditText eText = (EditText) view; 
       eText.addTextChangedListener(new TextWatcher(){ 

       @Override 
       public void afterTextChanged(Editable arg0) { 
        // TODO Auto-generated method stub 

       } 

       @Override 
       public void beforeTextChanged(CharSequence arg0, int arg1, 
         int arg2, int arg3) { 
        // TODO Auto-generated method stub 

       } 

       @Override 
       public void onTextChanged(CharSequence s, int start, int before, int count) { 
        try{ 
         int num = Integer.parseInt(s.toString()); 
         setValue(num); //this line changes the value of your numberpicker 
        }catch(NumberFormatException E){ 
          //do your catching here 
        } 
       }});  
      } 
      } 
    } 

在你的XML文件,你把下面:

<com.mypackage.MyNumberPicker 
android:id="@+id/numberPicker1" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" /> 
0

爲什麼它不工作,這是因爲如果你看的setValue的NumberPicker實施,它調用其他方法的原因setValueInternal (int,boolean),它將2個參數作爲新值,當然還包括表示它是否應該通知UI有任何變化的bugger boolean。並猜測什麼,在setValue布爾總是與虛假。 Godammit。但還有一個技巧,我發現validateInputTextView實際上是正確的,它在編輯文本沒有焦點時調用。也許在正確的時間清除焦點將做到應該做的事情。