タイトルに基づいて、ユーザーに 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、すべてのコードがレイアウトされています。これでヌル ポインター例外が発生する理由について、助けと洞察をいただければ幸いです。
よろしく
チンチョイ