0

Androidのフラグメントに問題があります。

インテントを介してアクティティAに電話し、アクティティが以前に開始されていれば、機能します。他のケースでは、インテントを介してアクティティAを呼び出し、アクティティが以前に開始されていない場合、フラグメントオブジェクトを取得しようとすると、NullPointerExceptionがスローされます。

フラグメントにアクセスする必要がありますが、アクティビティが実行されていない場合はNPEを取得しました。

アクティビティ内で切り取られたコード:

public class HomeActivity extends BaseFragmentActivity {

@Override
protected void onNewIntent(Intent intent) {
        if (intent.hasExtra("tab")) {
            int tab = intent.getIntExtra("tab", 0);
            mTabsHelper.setTab(tab);
            if (intent.hasExtra("id")) {
                String tickerName = intent.getStringExtra("id");
                switchToExistTicker(tickerName);
            }
        }
    }

    private TickerListFragment getTickerListFragment() {
        TickerListFragment tickerListFragment = (TickerListFragment) getSupportFragmentManager()
                    .findFragmentByTag("android:switcher:2131099811:1");
        return tickerListFragment;
    }

    private void switchToNewTicker(String name) {
        getTickerListFragment().setNewTicketName(name);
    }

    private void switchToExistTicker(String name) {
        getTickerListFragment().switchToTicker(getTickerListFragment().getTickerIdForTickerName(name), true);
    }
}

通知を介してインテントを送信する責任がある他のアクティビティでは、次のコードが省略されています。

protected void sendnotification (String title, String message) {
    Intent i = new Intent("android.intent.action.MAIN");
    i.setComponent(new ComponentName("de.domain.android", "de.domain.android.HomeActivity"));
    i.putExtra("tab", 1);
    i.putExtra("id", "subject");
    i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP
                | Intent.FLAG_ACTIVITY_NEW_TASK);

    PendingIntent contentIntent = PendingIntent.getActivity(this, 0, i, 0);

    Notification n = new Notification(R.drawable.ic_launcher, message, System.currentTimeMillis());
    n.flags = Notification.FLAG_AUTO_CANCEL;
    n.setLatestEventInfo(getApplicationContext(), title, message, contentIntent);

    NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
    manager.notify(0, n);
}

通知が送信された後、ユーザーは通知をタッチしてアクティビティAを開きます。アクティビティAは、特定の追加機能を含むインテントを受け取ります(詳細については、添付のコードスニペットを参照してください)。説明したように、アクティビティAが以前に開始されていない場合、アクティビティはクラッシュしたため、新しく開始する必要があります。この場合、必要なフラグメントは見つかりませんでした。「null」が戻り値です。NullPointerExceptionが結果になります。また、説明したように、アクティビティが以前に開始された場合、アクティビティはクラッシュしません-その後、動作します。

例外在庫に続いて:

  8805         AndroidRuntime  E  FATAL EXCEPTION: main
  8805         AndroidRuntime  E  java.lang.RuntimeException: Unable to start activity ComponentInfo{de.domain.android/de.domain.android.HomeActivity}: java.lang.NullPointerException
  8805         AndroidRuntime  E    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2202)
  8805         AndroidRuntime  E    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2237)
  8805         AndroidRuntime  E    at android.app.ActivityThread.access$600(ActivityThread.java:139)
  8805         AndroidRuntime  E    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1262)
  8805         AndroidRuntime  E    at android.os.Handler.dispatchMessage(Handler.java:99)
  8805         AndroidRuntime  E    at android.os.Looper.loop(Looper.java:154)
  8805         AndroidRuntime  E    at android.app.ActivityThread.main(ActivityThread.java:4974)
  8805         AndroidRuntime  E    at java.lang.reflect.Method.invokeNative(Native Method)
  8805         AndroidRuntime  E    at java.lang.reflect.Method.invoke(Method.java:511)
  8805         AndroidRuntime  E    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
  8805         AndroidRuntime  E    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
  8805         AndroidRuntime  E    at dalvik.system.NativeStart.main(Native Method)
  8805         AndroidRuntime  E  Caused by: java.lang.NullPointerException
  8805         AndroidRuntime  E    at de.domain.android.HomeActivity.switchToExistTicker(HomeActivity.java:144)
  8805         AndroidRuntime  E    at de.domain.android.HomeActivity.onNewIntent(HomeActivity.java:127)
  8805         AndroidRuntime  E    at de.domain.android.HomeActivity.onCreate(HomeActivity.java:94)
  8805         AndroidRuntime  E    at android.app.Activity.performCreate(Activity.java:4538)
  8805         AndroidRuntime  E    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1071)
  8805         AndroidRuntime  E    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2158)
  8805         AndroidRuntime  E    ... 11 more

どんな助けや提案も歓迎されます!

よろしく!

4

1 に答える 1

0

スタックトレースが示すように、NPEはクラスna行でログに記録されます。

... at de.domain.android.HomeActivity.switchToExistTicker(HomeActivity.java:144)

そのコードを提供しなかったため、HomeActivity.javaの144行目をチェックして、ある条件下でnullになる可能性のあるオブジェクトにアクセスしようとしないかどうかを確認する必要があります。とにかく、そこにブレークポイントを設定してデバッグします。関連する情報源がない私はこれ以上詳細な指針を与えることはできません。

于 2012-08-30T08:53:52.927 に答える