android intent putExtras

#android #android-intent

#Android #android-намерение

Вопрос:

Я прошу прощения за ОЧЕНЬ длинный вопрос, но добавил дополнительный код.

У меня проблема. Я только что опубликовал приложение, которое я протестировал на двух телефонах и эмуляторе. На этих устройствах все работает отлично.

Но проблема в том, что я получаю некоторые исключения от людей, использующих приложение.

Я использую

intent.putExtra("continue", "newGame");

чтобы определить, начинает ли пользователь новую игру или продолжает последнюю сохраненную игру.

Поскольку я использую расширение a TabActivity , я отправляю намерение my TabActivity , которое получает это с

String continueGame = getIntent().getExtras().getString("continue");

и после этого снова добавляем лишнее

 intent.putExtra("continue", continueGame);
 

когда я достигаю активности, я пытаюсь

         String continueGame;
        Bundle extras;
        if (bundle == null) {
            extras = getIntent().getExtras();
            if (extras == null) {
                continueGame = null;
            } else {
                continueGame = extras.getString("continue");
            }
        } else {
            continueGame = (String) bundle.getSerializable("continue");
        }
        assert continueGame != null;
        if (!continueGame.equals("continue")) {  <===This is line 75 in GamePlayerActivity
            playersGame = setNewGame();
            startPlayingGame();
        }
 

Но тут я получаю NullPointerException ответ . Вот stack_trace

 java.lang.RuntimeException: Unable to start activity ComponentInfo{home.android.yahtzee/home.android.yahtzee.activities.GameActivity}: java.lang.RuntimeException: Unable to start activity ComponentInfo{home.android.yahtzee/home.android.yahtzee.activities.GamePlayerActivity}: java.lang.NullPointerException
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
    at android.app.ActivityThread.access$2300(ActivityThread.java:125)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:123)
    at android.app.ActivityThread.main(ActivityThread.java:4627)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:521)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:871)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:629)
    at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.RuntimeException: Unable to start activity ComponentInfo{home.android.yahtzee/home.android.yahtzee.activities.GamePlayerActivity}: java.lang.NullPointerException
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)
    at android.app.ActivityThread.startActivityNow(ActivityThread.java:2503)
    at android.app.LocalActivityManager.moveToState(LocalActivityManager.java:127)
    at android.app.LocalActivityManager.startActivity(LocalActivityManager.java:339)
    at android.widget.TabHost$IntentContentStrategy.getContentView(TabHost.java:656)
    at android.widget.TabHost.setCurrentTab(TabHost.java:328)
    at android.widget.TabHost.addTab(TabHost.java:213)
    at home.android.yahtzee.activities.GameActivity.onCreate(GameActivity.java:36)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
    ... 11 more
Caused by: java.lang.NullPointerException
    at home.android.yahtzee.activities.GamePlayerActivity.onCreate(GamePlayerActivity.java:75)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
    ... 20 more
java.lang.RuntimeException: Unable to start activity ComponentInfo{home.android.yahtzee/home.android.yahtzee.activities.GamePlayerActivity}: java.lang.NullPointerException
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)
    at android.app.ActivityThread.startActivityNow(ActivityThread.java:2503)
    at android.app.LocalActivityManager.moveToState(LocalActivityManager.java:127)
    at android.app.LocalActivityManager.startActivity(LocalActivityManager.java:339)
    at android.widget.TabHost$IntentContentStrategy.getContentView(TabHost.java:656)
    at android.widget.TabHost.setCurrentTab(TabHost.java:328)
    at android.widget.TabHost.addTab(TabHost.java:213)
    at home.android.yahtzee.activities.GameActivity.onCreate(GameActivity.java:36)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
    at android.app.ActivityThread.access$2300(ActivityThread.java:125)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:123)
    at android.app.ActivityThread.main(ActivityThread.java:4627)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:521)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:871)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:629)
    at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.NullPointerException
    at home.android.yahtzee.activities.GamePlayerActivity.onCreate(GamePlayerActivity.java:75)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
    ... 20 more
java.lang.NullPointerException
    at home.android.yahtzee.activities.GamePlayerActivity.onCreate(GamePlayerActivity.java:75)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
    at android.app.ActivityThread.startActivityNow(ActivityThread.java:2503)
    at android.app.LocalActivityManager.moveToState(LocalActivityManager.java:127)
    at android.app.LocalActivityManager.startActivity(LocalActivityManager.java:339)
    at android.widget.TabHost$IntentContentStrategy.getContentView(TabHost.java:656)
    at android.widget.TabHost.setCurrentTab(TabHost.java:328)
    at android.widget.TabHost.addTab(TabHost.java:213)
    at home.android.yahtzee.activities.GameActivity.onCreate(GameActivity.java:36)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
    at android.app.ActivityThread.access$2300(ActivityThread.java:125)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:123)
    at android.app.ActivityThread.main(ActivityThread.java:4627)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:521)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:871)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:629)
    at dalvik.system.NativeStart.main(Native Method)
 

Надеюсь, вы сможете помочь, как обычно:)

Редактировать

 public class GameActivity extends TabActivity {
    @Override
    public void onCreate(Bundle bundle){
        super.onCreate(bundle);
        setContentView(R.layout.tab_handler);
        Resources res = getResources(); // Resource object to get Drawables
        TabHost tabHost = getTabHost();  // The activity TabHost
        TabHost.TabSpec spec;  // Resusable TabSpec for each tab
        Intent intent;  // Reusable Intent for each tab
        Gson gson = new Gson();
        Player player = gson.fromJson(getIntent().getExtras().getString("player"), Player.class);
        String continueGame = getIntent().getExtras().getString("continue");
        intent = new Intent().setClass(this, GamePlayerActivity.class);
        intent.putExtra("player", gson.toJson(player));
        intent.putExtra("continue", continueGame);
        // Initialize a TabSpec for each tab and add it to the TabHost
        spec = tabHost.newTabSpec(player.getName()).setIndicator(player.getName(),
                res.getDrawable(player.getDroid()))
                .setContent(intent); <-----------Line 36
        tabHost.addTab(spec); 
    }
}
 

Обновить
Я запускаю TabActivity из диалогового окна

 public class WhoIsPlayingDialog extends Dialog {
    private Player playerSelected;
    private DataApp app;

    public WhoIsPlayingDialog(final Context context) {
        super(context);
        setTitle(R.string.whoIsPlayingSpinnerTitle);
        setContentView(R.layout.who_is_playing_dialog);
        Spinner playerSpinner = (Spinner) findViewById(R.id.whoIsPlayingSpinner);
        app = (DataApp) context.getApplicationContext();
        PlayerAdapter playerAdapter = new PlayerAdapter(context, R.layout.player_view, app.db.getAllPlayers());
        playerAdapter.setDropDownViewResource(R.layout.player_view);
        playerSpinner.setAdapter(playerAdapter);
        playerSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
                playerSelected = (Player) adapterView.getItemAtPosition(view.getId());
                Button continueGameButton = (Button) findViewById(R.id.whoIsPlayingContinueGameButton);
                if (!app.db.getGame(playerSelected.getGameId()).isNewGame()) {
                    continueGameButton.setVisibility(View.VISIBLE);
                    continueGameButton.setOnClickListener(new View.OnClickListener() {
                        public void onClick(View view) {
                            Intent intent = new Intent(context, GameActivity.class);
                            Gson gson = new Gson();
                            intent.putExtra("player", gson.toJson(playerSelected));
                            intent.putExtra("continue", "continue");
                            context.startActivity(intent);
                            dismiss();
                        }
                    });
                }else {
                    continueGameButton.setVisibility(View.GONE);
                }
            }

            public void onNothingSelected(AdapterView<?> adapterView) {
            }
        });
        (findViewById(R.id.whoIsPlayingDialogOKButton)).setOnClickListener(new View.OnClickListener() {
            public void onClick(View view) {
                Intent intent = new Intent(context, GameActivity.class);
                Gson gson = new Gson();
                intent.putExtra("continue", "newGame");
                intent.putExtra("player", gson.toJson(playerSelected));
                context.startActivity(intent);
                dismiss();
            }
        }
        );
    }

}
 

Только что заметил, что я получаю nullPointerException в GameActivity aswell

 at home.android.yahtzee.activities.GameActivity.onCreate(GameActivity.java:36)
 

Комментарии:

1. можете ли вы ввести весь код действия целиком? потому что этого кода недостаточно для того, чтобы мы могли взглянуть на проблему.

2. Вы уверены, что дополнительное «продолжить» всегда действительно присутствует либо в намерении, либо в пакете?

3. Почему вы употребляете setContent(intent) ? Этот метод официально устарел и с самого начала никогда не был особенно хорошей идеей. Просто используйте Views как содержимое ваших вкладок, и вы сможете обойти все свои проблемы с помощью дополнений.

4. @CommonsWare Здесь у меня есть TabActivity, который обрабатывает вкладки, и Activity, который делает все остальное. Вы имеете в виду, что все должно выполняться в одном и том же действии?

5. в учебном пособии developer.android.com/resources/tutorials/views/… Они также используют setContent(намерение)??

Ответ №1:

Согласно трассировке стека, и если ваша строка 75 является той, что указана в трассировке стека, continueGame находится null в этой точке.
Возможно, вы захотите записать, откуда берется значение во время выполнения.

Как насчет Bundle ? Вы записываете свои данные в пакет onSaveInstanceState() ?

Комментарии:

1. Я попытался выполнить отладку и последовал дополнительному «продолжить». Я также говорю мне, что continueGame это либо newGame или continue зависит от того, что я делаю. Так что это не null так. Но, как я уже писал в вопросе, приложение работает на моем телефоне, другом телефоне и эмуляторе. Вот почему я также думаю, что трудно найти ошибку, так как я не могу сгенерировать исключение.