【问题标题】:Android App custom Number PickerAndroid App 自定义号码选择器
【发布时间】:2015-04-27 19:35:47
【问题描述】:

所以我目前正在制作一个需要数字选择器的应用。我已经使用 -button textview +button 布局创建了数字选择器。 t选择器工作正常,除了当您删除数字并尝试按任何按钮时,此时应用程序崩溃。

public class MainActivity extends Activity implements OnClickListener {
Button btnUp, btnDown;
EditText editTextSonyResult;

int nStart = (-100);
int nEnd = 250;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    btnUp = (Button) findViewById(R.id.plusButton1);
    btnDown = (Button) findViewById(R.id.minusButton1);


    editTextSonyResult = (EditText) findViewById(R.id.numberView1);

    editTextSonyResult.setText("0");

    btnUp.setOnClickListener(this);
    btnDown.setOnClickListener(this);
}

public void onClick(View v) {
    String getString = String.valueOf(editTextSonyResult.getText());
    int current = Integer.parseInt(getString);


    if (v == btnUp) {
        if (current < nEnd) {

            current++;
            editTextSonyResult.setText(String.valueOf(current));
        }

    }
    if (v == btnDown) {
        if (current > nStart) {

            current--;
            editTextSonyResult.setText(String.valueOf(current));

        }
    }
}

任何帮助将不胜感激。 干杯

这里是错误点的 logcat 04-27 19:58:10.042 3016-3016/com.example.liam.sonyreportingapp D/AndroidRuntime: 关闭虚拟机 04-27 19:58:10.042 3016-3016/com.example.liam.sonyreportingapp E/AndroidRuntime: 致命异常:主要 进程:com.example.liam.sonyreportingapp,PID:3016 java.lang.NumberFormatException:无效的int:“” 在 java.lang.Integer.invalidInt(Integer.java:138) 在 java.lang.Integer.parseInt(Integer.java:358) 在 java.lang.Integer.parseInt(Integer.java:334) 在 com.example.liam.sonyreportingapp.MainActivity.onClick(MainActivity.java:42) 在 android.view.View.performClick(View.java:4780) 在 android.view.View$PerformClick.run(View.java:19866) 在 android.os.Handler.handleCallback(Handler.java:739) 在 android.os.Handler.dispatchMessage(Handler.java:95) 在 android.os.Looper.loop(Looper.java:135) 在 android.app.ActivityThread.main(ActivityThread.java:5257) 在 java.lang.reflect.Method.invoke(本机方法) 在 java.lang.reflect.Method.invoke(Method.java:372) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)

【问题讨论】:

  • 你的电流变空了..这就是原因

标签: java android


【解决方案1】:

EditText 将允许用户手动输入。如果您不希望用户拥有此功能,请改用 TextView。

它在你的崩溃

int current = parseInt(getString);

因为如果您的 EditText 是空的,因为用户清除了该框,则 parseInt 将返回 NaN(不是数字),它不能存储为 int,因此它会崩溃。

编辑:这是当他们关闭 android 键盘但将条目留空时的处理方式,不要忘记检查非数字条目,而不仅仅是空白条目..

((EditText)findViewById(R.id.numberView1)).setOnEditorActionListener(new TextView.OnEditorActionListener() {
        public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
            if (actionId == EditorInfo.IME_ACTION_DONE) {
                    //CHECK USER INPUT HERE. IF BLANK SET BACK TO 0 or DO NOT UPDATE VALUE ETC
                return true;
            }
            //I think this is if user presses back instead of pressing done/ok but i've never added code here
            return false;
        }
    });

然后添加

android:imeActionId="@+id/IME_ACTION_SEND"

在您的 XML 中的 EditText 内

编辑:删除问题。

另外,btnDown 是否应该检查当前 > nEnd,而不是小于?或当前

【讨论】:

  • 抱歉,我的命名约定有误。它实际上是一个编辑文本,因此用户可以手动更改它。我已经改变了
  • 好的,EditText 会让他们改变它。我认为这是 ParseInt 返回 NaN 的根源 - 可以通过您的堆栈跟踪确认。如果您想允许用户手动编辑该字段(没有您的按钮),请查看我使用输入管理器(Android 键盘)的代码进行的编辑
  • 是的,正如我所怀疑的那样。查看您发布的堆栈跟踪的第 5 行和第 6 行。只需在某处添加一些代码即可检查用户输入的内容。如果它是空白或非数字,那么您需要在使用 parseint 更新当前变量之前处理它
  • 我没有对你投反对票。但是,我很确定您不应该在答案中提问。
  • 啊,谢谢,这很公平,这很有意义 Luis,不幸的是我还不能制作 cmets,所以它限制了我与 OP 的互动以获得更多信息,而无需在答案部分发布。甚至在发布堆栈跟踪并确定所使用语言的差异之前,我的原始回复确实包含正确的解决方案。无论如何,谢谢,我很欣赏这些信息,只是希望反对者会说,而不是什么都不说:/
【解决方案2】:

以防万一,这是现有答案的替代方案,前段时间我制作了一个自定义 NumberPicker 类,您可以简单地将其添加到布局 xml 文件中:

Custom NumberPicker class on github

【讨论】:

    猜你喜欢
    • 2014-04-01
    • 2020-01-22
    • 1970-01-01
    • 2020-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-17
    • 2012-08-25
    相关资源
    最近更新 更多