1

根据标题,我正在尝试开发一个计时器应用程序,该应用程序将为用户提供一个带有 2 个数字选择器的对话框。这两个数字选择器用于分钟和秒,并设置为最大值 59 和最小值 0。话虽如此,我遇到的问题是第一个数字选择器的 setMaxValue 返回空指针错误。请查看代码部分及其返回的日志:

        public void showDialog(){
    final Dialog cusd = new Dialog(MainActivity.this);
    cusd.setTitle("Tag and Timer Selector");
    cusd.setContentView(R.layout.dialogbox);
    final Button canlbtn = (Button) findViewById(R.id.cancelbtn);
    final Button sbtbtn = (Button) findViewById(R.id.submitbtn);
    final NumberPicker minnp = (NumberPicker) findViewById(R.id.numberPicker1);
    final NumberPicker secnp = (NumberPicker) findViewById(R.id.numberPicker2);
    final EditText tagvalue = (EditText) findViewById(R.id.tagname);
    minnp.setMaxValue(59);
    minnp.setMinValue(0);
    minnp.setWrapSelectorWheel(false);
    minnp.setOnValueChangedListener(this);
    secnp.setMaxValue(59);
    secnp.setMinValue(0);
    secnp.setWrapSelectorWheel(false);
    secnp.setOnValueChangedListener(this);
    canlbtn.setOnClickListener(new OnClickListener(){

        @Override
        public void onClick(View v) {
            cusd.dismiss();

        }

    });
    sbtbtn.setOnClickListener(new OnClickListener(){

        @Override
        public void onClick(View v) {
            tgview.setText(String.valueOf(tagvalue.getText()));
            minview.setText(String.valueOf(minnp.getValue()));
            secview.setText(String.valueOf(secnp.getValue()));
            cusd.dismiss();
        }

    });
    cusd.show();
}

日志突出显示错误或空指针异常显示在从第 59 行调用的第 80 行,这是从 switch case 对方法的调用。请查看以下日志:

    01-01 16:29:49.982: W/dalvikvm(1946): threadid=1: thread exiting with uncaught exception (group=0xb4a57ba8)
    01-01 16:29:50.002: E/AndroidRuntime(1946): FATAL EXCEPTION: main
    01-01 16:29:50.002: E/AndroidRuntime(1946): Process: com.vertygoeclypse.multitimer, PID: 1946
    01-01 16:29:50.002: E/AndroidRuntime(1946): java.lang.NullPointerException
    01-01 16:29:50.002: E/AndroidRuntime(1946):     at com.vertygoeclypse.multitimer.MainActivity.showDialog(MainActivity.java:80)
    01-01 16:29:50.002: E/AndroidRuntime(1946):     at com.vertygoeclypse.multitimer.MainActivity.onClick(MainActivity.java:59)
    01-01 16:29:50.002: E/AndroidRuntime(1946):     at android.view.View.performClick(View.java:4438)
    01-01 16:29:50.002: E/AndroidRuntime(1946):     at android.view.View$PerformClick.run(View.java:18422)
    01-01 16:29:50.002: E/AndroidRuntime(1946):     at android.os.Handler.handleCallback(Handler.java:733)
    01-01 16:29:50.002: E/AndroidRuntime(1946):     at android.os.Handler.dispatchMessage(Handler.java:95)
    01-01 16:29:50.002: E/AndroidRuntime(1946):     at android.os.Looper.loop(Looper.java:136)
    01-01 16:29:50.002: E/AndroidRuntime(1946):     at android.app.ActivityThread.main(ActivityThread.java:5017)
    01-01 16:29:50.002: E/AndroidRuntime(1946):     at java.lang.reflect.Method.invokeNative(Native Method)
    01-01 16:29:50.002: E/AndroidRuntime(1946):     at java.lang.reflect.Method.invoke(Method.java:515)
    01-01 16:29:50.002: E/AndroidRuntime(1946):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
    01-01 16:29:50.002: E/AndroidRuntime(1946):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
    01-01 16:29:50.002: E/AndroidRuntime(1946):     at dalvik.system.NativeStart.main(Native Method)
    01-01 16:29:52.352: I/Process(1946): Sending signal. PID: 1946 SIG: 9

话虽如此,第 80 行如下:

            minnp.setMaxValue(59);

我想知道为什么这给了我错误,因为它后面的行:

            minnp.setMinValue(0);
    minnp.setWrapSelectorWheel(false);
    minnp.setOnValueChangedListener(this);
    secnp.setMaxValue(59);
    secnp.setMinValue(0);
    secnp.setWrapSelectorWheel(false);
    secnp.setOnValueChangedListener(this);

我相信会抛出同样的异常。到目前为止,还请参阅下面我的所有代码和 xml 文件,因为它与应用程序相关:

    package com.vertygoeclypse.multitimer;
    import android.os.Bundle;
    import android.app.Activity;
    import android.app.Dialog;
    import android.view.Menu;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.NumberPicker;
    import android.widget.TextView;
    public class MainActivity extends Activity implements NumberPicker.OnValueChangeListener, OnClickListener{
Button dgbtn, abbtn, exbtn, cvbtn;
TextView tgview, minview, secview;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    dgbtn = (Button) findViewById(R.id.dialogbtn);
    abbtn = (Button) findViewById(R.id.aboutbtn);
    exbtn = (Button) findViewById(R.id.exitbtn);
    cvbtn = (Button) findViewById(R.id.clrvaluesbtn);
    tgview = (TextView) findViewById(R.id.tagview);
    minview = (TextView) findViewById(R.id.minview);
    secview = (TextView) findViewById(R.id.seecview);
    dgbtn.setOnClickListener(this);
    abbtn.setOnClickListener(this);
    exbtn.setOnClickListener(this);
    cvbtn.setOnClickListener(this);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}
@Override
public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
    // TODO Auto-generated method stub
}
@Override
public void onClick(View v) {
    switch(v.getId()){
    case R.id.dialogbtn:
        showDialog();
        break;
    case R.id.exitbtn:
        finish();
    case R.id.clrvaluesbtn:
        tgview.setText("");
        minview.setText("");
        secview.setText("");
        break;
    }
}
public void showDialog(){
    final Dialog cusd = new Dialog(MainActivity.this);
    cusd.setTitle("Tag and Timer Selector");
    cusd.setContentView(R.layout.dialogbox);
    final Button canlbtn = (Button) findViewById(R.id.cancelbtn);
    final Button sbtbtn = (Button) findViewById(R.id.submitbtn);
    final NumberPicker minnp = (NumberPicker) findViewById(R.id.numberPicker1);
    final NumberPicker secnp = (NumberPicker) findViewById(R.id.numberPicker2);
    final EditText tagvalue = (EditText) findViewById(R.id.tagname);
    minnp.setMaxValue(59);
    minnp.setMinValue(0);
    minnp.setWrapSelectorWheel(false);
    minnp.setOnValueChangedListener(this);
    secnp.setMaxValue(59);
    secnp.setMinValue(0);
    secnp.setWrapSelectorWheel(false);
    secnp.setOnValueChangedListener(this);
    canlbtn.setOnClickListener(new OnClickListener(){
        @Override
        public void onClick(View v) {
            cusd.dismiss();
        }
    });
    sbtbtn.setOnClickListener(new OnClickListener(){
        @Override
        public void onClick(View v) {
            tgview.setText(String.valueOf(tagvalue.getText()));
            minview.setText(String.valueOf(minnp.getValue()));
            secview.setText(String.valueOf(secnp.getValue()));
            cusd.dismiss();
        }
    });
    cusd.show();
}
    }

这是应用程序的 xmls,我将从 main 开始,它只是一个基本布局,用于保存 textviews 和按钮,一旦应用程序正常运行,我将处理外观:

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/LinearLayout1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >

<TextView
    android:id="@+id/textView1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/hello_world" />

<TextView
    android:id="@+id/textView2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Minutes" />

<TextView
    android:id="@+id/minview"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="TextView" />

<TextView
    android:id="@+id/textView4"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Seconds" />

<TextView
    android:id="@+id/seecview"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="TextView" />

<TextView
    android:id="@+id/textView6"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Tag Name" />

<TextView
    android:id="@+id/tagview"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="TextView" />

<Button
    android:id="@+id/dialogbtn"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Dialog box" />

<Button
    android:id="@+id/clrvaluesbtn"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Clear Values" />

<Button
    android:id="@+id/aboutbtn"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="About" />

<Button
    android:id="@+id/exitbtn"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Exit" />

    </LinearLayout>

这是对话框 xml,它使用了我将在后面列出的特定样式:

    <?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:background="#336699">
 <TextView style="@style/InfoFont" android:text="Enter a Tag for your Timer" android:layout_gravity="center_horizontal"/>
    <EditText
    android:id="@+id/tagname"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:ems="10"
    android:background="#ffffff"
    android:singleLine="true">
    <requestFocus />
</EditText>
<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal" >
    <NumberPicker
        android:id="@+id/numberPicker1"
        android:layout_marginTop="15sp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="30" />
    <NumberPicker
        android:id="@+id/numberPicker2"
        android:layout_marginTop="15sp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="30" />
</LinearLayout>
<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content" >
    <TextView style="@style/InfoFont" android:text="Minutes" android:gravity="center" android:layout_weight="30"  />
    <TextView style="@style/InfoFont" android:text="Seconds" android:gravity="center" android:layout_weight="30"  />
</LinearLayout>
<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content" >
    <Button
        android:id="@+id/cancelbtn"
        style="@android:attr/buttonBarButtonStyle"
        android:layout_width="30sp"
        android:layout_height="wrap_content"
        android:text="Cancel" 
        android:layout_weight="50"
        android:background="#669900"
        android:layout_marginLeft="5sp"
        android:layout_marginRight="5sp"
        android:layout_marginTop="15sp"
        android:layout_marginBottom="15sp"/>
    <Button
        android:id="@+id/submitbtn"
        style="@android:attr/buttonBarButtonStyle"
        android:layout_width="30sp"
        android:layout_height="wrap_content"
        android:text="Submit" 
        android:layout_weight="50"
        android:background="#669900"
        android:layout_marginRight="5sp"
        android:layout_marginLeft="5sp"
        android:layout_marginTop="15sp"
        android:layout_marginBottom="15sp"/>
</LinearLayout>
    </LinearLayout>

现在是对话框 xml 的样式,它实际上只是对 textview 的修改以整理代码。

    <style name="InfoFont" parent="@android:style/TextAppearance.Medium">
        <item name="android:layout_width">wrap_content</item>
        <item name="android:layout_height">wrap_content</item>
        <item name="android:gravity">center</item>
        <item name="android:textColor">#ffffff</item>
        <item name="android:textStyle">bold</item>
        <item name="android:shadowColor">#000000</item>
        <item name="android:shadowDx">1</item>
        <item name="android:shadowDy">-1</item>
        <item name="android:shadowRadius">3</item>
        <item name= "android:typeface">monospace </item>
        <item name= "android:layout_marginTop">15sp </item>
        <item name= "android:layout_marginBottom">15sp </item>
    </style>

好的,所有代码都已列出,我将不胜感激任何帮助和洞察为什么我会得到一个空指针异常。

问候

钦乔伊

4

1 回答 1

2

showDialog()尝试获取对布局中组件的引用时,请调用findViewById()对话框,而不是活动视图层次结构。也就是说,cusd.findViewById(...)而不是 plain findViewById(...)

于 2014-01-01T21:53:29.617 回答