0

2つのアクティビティ画面があります。1つ目は2つのボタンがあります。Button1はユーザー入力に基づいてデータを処理し、Button2はプロセスの結果に基づいてユーザーを次のアクティビティ画面に導きます。

Button1をクリックするたびに何も起こらず、

Button2をクリックすると、アプリが機能しなくなり、「残念ながら...」というメッセージが表示されます。最初はすべてうまくいっていますが、いくつかのコードを追加すると、アプリが実行されなくなります。

主な活動

public class MainActivity extends Activity
{
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

    //for the header
        View title = getWindow().findViewById(android.R.id.title);
        if (title != null)
        { 
            ViewParent titleBar = title.getParent();
            if (titleBar != null && (titleBar instanceof View))
            { 
                View parentView = (View)titleBar; 
                parentView.setBackgroundColor(Color.RED); 
            }
        }

    //for button2
        Button next = (Button) findViewById(R.id.DGButton);
        next.setOnClickListener(new View.OnClickListener()
        {
            public void onClick(View view)
            {
                Intent myIntent = new Intent(view.getContext(), Activity2.class);
                startActivityForResult(myIntent, 0);
            }

        });
    } 

    public void calculateClickHandler(View view)
    {
        //handle the click of button1

        if (view.getId() == R.id.CalculateButton)
        {
         //some codes

    //the next activity screen uses the calculated value for some outputs
         Intent intent1 = new Intent(MainActivity.this, Activity2.class);
        Bundle b = new Bundle();
        b.putDouble("key", bmiValue);
        intent1.putExtras(b);
        startActivityForResult(intent1,0);
    }
    }

アクティビティ2:

public class Activity2 extends Activity
{ 
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);

        Button next = (Button) findViewById(R.id.BackToBMI);
        next.setOnClickListener(new View.OnClickListener() {
            public void onClick(View view) {
                Intent intent = new Intent();
                setResult(RESULT_OK, intent);
                finish();
            }
        });
//some codes

        Bundle b = getIntent().getExtras(); //the nullpointerexception is here
        double bmival = b.getDouble("key");
}
}

Logcat:

12-27 05:15:03.263: E/AndroidRuntime(1091): FATAL EXCEPTION: main
12-27 05:15:03.263: E/AndroidRuntime(1091): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.bmicaldg/com.example.bmicaldg.Activity2}: java.lang.NullPointerException
12-27 05:15:03.263: E/AndroidRuntime(1091):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180)
12-27 05:15:03.263: E/AndroidRuntime(1091):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
12-27 05:15:03.263: E/AndroidRuntime(1091):     at android.app.ActivityThread.access$600(ActivityThread.java:141)
12-27 05:15:03.263: E/AndroidRuntime(1091):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
12-27 05:15:03.263: E/AndroidRuntime(1091):     at android.os.Handler.dispatchMessage(Handler.java:99)
12-27 05:15:03.263: E/AndroidRuntime(1091):     at android.os.Looper.loop(Looper.java:137)
12-27 05:15:03.263: E/AndroidRuntime(1091):     at android.app.ActivityThread.main(ActivityThread.java:5039)
12-27 05:15:03.263: E/AndroidRuntime(1091):     at java.lang.reflect.Method.invokeNative(Native Method)
12-27 05:15:03.263: E/AndroidRuntime(1091):     at java.lang.reflect.Method.invoke(Method.java:511)
12-27 05:15:03.263: E/AndroidRuntime(1091):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
12-27 05:15:03.263: E/AndroidRuntime(1091):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
12-27 05:15:03.263: E/AndroidRuntime(1091):     at dalvik.system.NativeStart.main(Native Method)
12-27 05:15:03.263: E/AndroidRuntime(1091): Caused by: java.lang.NullPointerException
12-27 05:15:03.263: E/AndroidRuntime(1091):     at com.example.bmicaldg.Activity2.onCreate(Activity2.java:33)
12-27 05:15:03.263: E/AndroidRuntime(1091):     at android.app.Activity.performCreate(Activity.java:5104)
12-27 05:15:03.263: E/AndroidRuntime(1091):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
12-27 05:15:03.263: E/AndroidRuntime(1091):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144)
12-27 05:15:03.263: E/AndroidRuntime(1091):     ... 11 more

また、これはMainActivityのXMLファイルです。

ボタン1:

<Button
        android:id="@+id/CalculateButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_above="@+id/textView4"
        android:layout_alignParentRight="true"
        android:layout_marginBottom="14dp"
        android:background="#FF0000"
        android:minHeight="30dip"
        android:minWidth="65dip"
        android:onClick="calculateClickHandler"
        android:text="@string/CalculateButton"
        android:textColor="#FFFFFF"
        android:textSize="14sp" />

ボタン2:

<Button
        android:id="@+id/DGButton"
        style="?android:attr/buttonStyleSmall"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"
        android:background="#FF0000"
        android:minHeight="30dip"
        android:onClick="calculateClickHandler"
        android:text="@string/DGButton"
        android:textColor="#FFFFFF" />

私はAndroidモバイルプログラミングの初心者なので、助けていただければ幸いです。

4

5 に答える 5

1

このエラーは、次のボタンのクリック イベントで意図的に double 値を渡していないために発生します。

以下のコードを書く

Intent intent1 = new Intent(MainActivity.this, Activity2.class);
intent1.putExtra("key", bmiValue);
startActivity(intent1);

calculateClickHandler()次のボタンのクリックイベントとメソッドの意図コードの下のコードの代わりに。

Intent myIntent = new Intent(view.getContext(), Activity2.class);
startActivityForResult(myIntent, 0);

それはあなたの問題を解決します。

于 2012-12-27T05:39:17.843 に答える
1

次のコードを置き換えてみてください:

//for button2
        Button next = (Button) findViewById(R.id.DGButton);
        next.setOnClickListener(new View.OnClickListener()
        {
            public void onClick(View view)
            {
                Intent myIntent = new Intent(view.getContext(), Activity2.class);
                startActivityForResult(myIntent, 0);
            }

        });

これとともに:

//for button2
        Button next = (Button) findViewById(R.id.DGButton);
        next.setOnClickListener(new View.OnClickListener()
        {
            public void onClick(View view)
            {
                Intent myIntent = new Intent(MainActivity.this, Activity2.class);
                startActivityForResult(myIntent, 0);
            }

        });

EDIT1: logcat ログの後に更新..

メソッドの最後の行でdouble bmival = b.getDouble("key");、バンドルから値を読み取ろうとしています。メソッドgetExtras()の次の javadoc に従って:

以前に で追加されたすべてのエクストラのマップを返しますputExtra()。追加されていない場合は null を返します。

MainActivityby usingに値を設定していないためputExtra()、 への呼び出しへの応答で null を取得していますgetExtras()putExtra()したがって、 を呼び出して、次のコードのようにMainActivity値を渡す必要があります。Activity2

//for button2
        Button next = (Button) findViewById(R.id.DGButton);
        next.setOnClickListener(new View.OnClickListener()
        {
            public void onClick(View view)
            {
                Intent myIntent = new Intent(view.getContext(), Activity2.class);
                 //Assuming bmival is a class variable that has the value that you want to pass on to Activity2
                  myIntent.putExtra("key",bmival);

                startActivityForResult(myIntent, 0);
            }

        });

また、次のコードのように、バンドルから値を読み取る前に null チェックを入れてください。

if(b!=null){
   double bmival = b.getDouble("key");
}
于 2012-12-27T05:33:08.423 に答える
1

startActivity()代わりに使用する方が良いstartActivityForResult(intent1,0)

また、受信側で、余分なものを取得しているかどうかを確認してください

だからこのようにしてみてください

 Bundle extras = getIntent().getExtras();
 if(extras != null)
 {
    double bmival = extras.getDouble("key");
 }
于 2012-12-27T05:33:09.660 に答える
1

私はあなたがこれを探していると思います、これを試してください

    //for button2
    Button next = (Button) findViewById(R.id.DGButton);
    next.setOnClickListener(new View.OnClickListener() {
        public void onClick(View view) {
            Intent myIntent = new Intent(MainActivity.this, Activity2.class);
            Bundle b = new Bundle();
            b.putDouble("key", bmiValue);
            intent1.putExtras(b);
            startActivityForResult(myIntent, 0);
        }

    });
于 2012-12-27T05:41:12.463 に答える
1

多少の誤差はあるかもしれませんが、

  • 最初の最も可能性の高いケースは、マニフェスト ファイルで 2 番目のアクティビティを定義していないことです。そのため、まずマニフェスト ファイルですべてのアクティビティを定義したかどうかを確認してください。

  • 次のステートメントは完全に間違っています。

    Intent myIntent = new Intent(view.getContext(), Activity2.class);

ここではViewof Buttin'sを使用しonClickListenerていますが、代わりに the Activity Context, likeMyActivity.thisまたは the Application's Context, like thisを使用する必要がありますgetApplicationContext()

  • 使ってみて

    startActivity(myIntent);

それ以外の

startActivityForResult(myIntent, 0);
  • 問題がまったく解決されない場合、最後の可能性が低いケースは次のとおりです。

このように、インテントにフラグを追加してみてください

myIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  • インテント エクストラに値を設定していません。次のアクティビティでエラーが発生しますが、

    myIntent.putExtra("key", bmiValue);

于 2012-12-27T05:46:54.267 に答える