1

タイトルに基づいて、ユーザーに 2 つの番号ピッカーを含むダイアログ ボックスを提供するタイマー アプリを開発しようとしています。これら 2 つの数値ピッカーは分と秒用で、最大値 59 と最小値 0 に設定されています。私が抱えている問題は、最初の数値ピッカーの setMaxValue が null ポインター エラーを返すことです。コードの一部とそれが返すログを参照してください。

        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();
}

ログは、switch ケースからのメソッドの呼び出しである 59 行目から呼び出された 80 行目に、エラーまたはヌル ポインター例外が表示されていることを強調しています。以下のログを参照してください。

    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();
}
    }

アプリの xml は次のとおりです。テキストビューとボタンを保持するための基本的なレイアウトであるメインから始めます。アプリが機能したら、外観に取り組みます。

    <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 のスタイルです。実際には、コードを整理するためのテキストビューの変更にすぎません。

    <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>

OK、すべてのコードがレイアウトされています。これでヌル ポインター例外が発生する理由について、助けと洞察をいただければ幸いです。

よろしく

チンチョイ

4

1 に答える 1

2

showDialog()レイアウト内のコンポーネントへの参照を取得しようとするときは、アクティビティ ビュー階層ではなく、ダイアログで呼び出しますfindViewById()。つまりcusd.findViewById(...)、プレーンの代わりにfindViewById(...).

于 2014-01-01T21:53:29.617 に答える