2013-09-22 66 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实际上是正确的,它在编辑文本没有焦点时调用。也许在正确的时间清除焦点将做到应该做的事情。