Return extras onActivityResult 始终为 null

Return extras onActivityResult always null

我正在构建我的第一个应用程序,我 运行 遇到了一个问题,即在 ActivityResult 的意图中传递额外内容。我试图寻找答案,但找不到合适的答案。据我所知,我遵循使用意图传递数据的“正常”结构,确保使用 setResult() 传递的意图而不是 activity 的意图。但是我的知识非常有限,所以我可能只是忽略了一些明显的东西。

该应用程序的想法是在纸牌游戏中跟踪分数。

我的应用目前包含 3 个活动。

  1. MainActivity是填写玩家名字的主界面
  2. StartToWiez 使用这些名称并创建一个 table 来记录分数。
  3. 从此页面开始新的 activity (StartRound) 以根据用户的输入计算分数。
  4. 然后应将此分数传回 StartToWiez activity,StartToWiez activity 应使用分数填充 table。

我尝试在 setResult() 中传递的意图的附加项中传递一个包。我试着把乐谱作为意图的直接附加物。通过这两种方式,我都会得到同样的错误。所以看起来返回的 extras 在返回的意图中不存在。但我不明白为什么不像 setResult() 那样意图有额外的东西。

错误:

E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.wiezen, PID: 7924
java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1, result=-1, data=Intent { (has extras) }} to activity {com.example.wiezen/com.example.wiezen.StartToWiez}: java.lang.NullPointerException: Attempt to invoke virtual method 'int java.lang.Integer.intValue()' on a null object reference
    at android.app.ActivityThread.deliverResults(ActivityThread.java:4976)
    at android.app.ActivityThread.handleSendResult(ActivityThread.java:5017)
    at android.app.servertransaction.ActivityResultItem.execute(ActivityResultItem.java:51)
    at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
    at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2123)
    at android.os.Handler.dispatchMessage(Handler.java:107)
    at android.os.Looper.loop(Looper.java:214)
    at android.app.ActivityThread.main(ActivityThread.java:7710)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:516)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:950)
 Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'int java.lang.Integer.intValue()' on a null object reference
    at com.example.wiezen.StartToWiez.onActivityResult(StartToWiez.java:65)
    at android.app.Activity.dispatchActivityResult(Activity.java:8140)
    at android.app.ActivityThread.deliverResults(ActivityThread.java:4969)
    at android.app.ActivityThread.handleSendResult(ActivityThread.java:5017) 
    at android.app.servertransaction.ActivityResultItem.execute(ActivityResultItem.java:51) 
    at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 
    at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2123) 
    at android.os.Handler.dispatchMessage(Handler.java:107) 
    at android.os.Looper.loop(Looper.java:214) 
    at android.app.ActivityThread.main(ActivityThread.java:7710) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:516) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:950) 

Activity: MainActivity.java

package com.example.wiezen;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.view.View;
import android.widget.EditText;


public class MainActivity extends AppCompatActivity {

//create a Bundle object
Bundle extras = new Bundle();
SharedPreferences sharedpreferences;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    sharedpreferences = getSharedPreferences("Settings", Context.MODE_PRIVATE);
}
/** Called when the user taps the Send button */
public void startToWiez(View view) {
    Intent intent = new Intent(this, StartToWiez.class);
    EditText player1Name = (EditText) findViewById(R.id.Player1Name);
    String player1NameText = player1Name.getText().toString();

    EditText player2Name = (EditText) findViewById(R.id.Player2Name);
    String player2NameText = player2Name.getText().toString();

    EditText player3Name = (EditText) findViewById(R.id.Player3Name);
    String player3NameText = player3Name.getText().toString();

    EditText player4Name = (EditText) findViewById(R.id.Player4Name);
    String player4NameText = player4Name.getText().toString();

    SharedPreferences.Editor editor = sharedpreferences.edit();
    editor.putString("PLAYER1_NAME", player1NameText);
    editor.putString("PLAYER2_NAME", player2NameText);
    editor.putString("PLAYER3_NAME", player3NameText);
    editor.putString("PLAYER4_NAME", player4NameText);
    editor.apply();

    startActivity(intent);
}}

Activity StartToWiez.java

package com.example.wiezen;

import androidx.appcompat.app.AppCompatActivity;

import android.annotation.SuppressLint;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.EditText;
import android.widget.TableLayout;
import android.widget.TableRow;
import android.widget.TextView;

public class StartToWiez extends AppCompatActivity {

Bundle extras;
SharedPreferences sharedpreferences;
Integer player1Score;
Integer player2Score;
Integer player3Score;
Integer player4Score;
Integer aantalRondes = 0;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_start_to_wiez);
    // Get the Intent that started this activity and extract the string
    Intent intent = getIntent();
    sharedpreferences = getSharedPreferences("Settings", Context.MODE_PRIVATE);
    extras = intent.getExtras();
    // Capture the layout's TextView and set the string as its text
    TextView header1 = findViewById(R.id.Player1Header);
    TextView header2 = findViewById(R.id.Player2Header);
    TextView header3 = findViewById(R.id.Player3Header);
    TextView header4 = findViewById(R.id.Player4Header);
    header1.setText(sharedpreferences.getString("PLAYER1_NAME", "Player 1"));
    header2.setText(sharedpreferences.getString("PLAYER2_NAME", "Player 2"));
    header3.setText(sharedpreferences.getString("PLAYER3_NAME", "Player 3"));
    header4.setText(sharedpreferences.getString("PLAYER4_NAME", "Player 4"));
}

public void startRound(View view) {
    Intent intent = new Intent(this, StartRound.class);
    startActivityForResult(intent, 1);


}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == RESULT_OK) {
        aantalRondes++;

        TableLayout table = (TableLayout) StartToWiez.this.findViewById(R.id.tableLayout);
        // Inflate your row "template" and fill out the fields.
        TableRow row = (TableRow) LayoutInflater.from(StartToWiez.this).inflate(R.layout.tablerow, null);

        player1Score += data.getIntExtra("Player1Score", 0);
        player2Score += data.getIntExtra("Player2Score", 0);
        player3Score += data.getIntExtra("Player3Score", 0);
        player4Score += data.getIntExtra("Player4Score", 0);

        ((TextView) row.findViewById(R.id.player1Score)).setText(String.valueOf(player1Score));
        ((TextView) row.findViewById(R.id.player2Score)).setText(String.valueOf(player2Score));
        ((TextView) row.findViewById(R.id.player3Score)).setText(String.valueOf(player3Score));
        ((TextView) row.findViewById(R.id.player4Score)).setText(String.valueOf(player4Score));
        table.addView(row);

        if(aantalRondes == 4){
            TableRow row2 = (TableRow) LayoutInflater.from(StartToWiez.this).inflate(R.layout.line_after_4_rounds, null);
            table.addView(row2);
            aantalRondes = 0;
        }
    }
}

}

Activity: StartRound.java

package com.example.wiezen;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CheckedTextView;
import android.widget.Spinner;
import android.widget.TextView;

import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Arrays;

public class StartRound extends AppCompatActivity {


SharedPreferences sharedpreferences;
Spinner gameType;
Spinner troef;
Spinner aantalSlagen;
ArrayAdapter<String> adapter;
ArrayAdapter<String> adapterTroef;
ArrayAdapter<String> adapterAantalSlagen;
CheckBox player1;
CheckBox player2;
CheckBox player3;
CheckBox player4;
CheckBox player1Win;
CheckBox player2Win;
CheckBox player3Win;
CheckBox player4Win;
Boolean[] winners = new Boolean[4];


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_start_round);
    // Get the Intent that started this activity and extract the string
    Intent intent = getIntent();

    //get the shared prefs that store player names
    sharedpreferences = getSharedPreferences("Settings", Context.MODE_PRIVATE);

    //set player names for the checkboxes
    player1 = findViewById(R.id.player1Checkbox);
    player2 = findViewById(R.id.player2Checkbox);
    player3 = findViewById(R.id.player3Checkbox);
    player4 = findViewById(R.id.player4Checkbox);
    player1.setText(sharedpreferences.getString("PLAYER1_NAME", "defaultValue"));
    player2.setText(sharedpreferences.getString("PLAYER2_NAME", "defaultValue"));
    player3.setText(sharedpreferences.getString("PLAYER3_NAME", "defaultValue"));
    player4.setText(sharedpreferences.getString("PLAYER4_NAME", "defaultValue"));

    player1Win = findViewById(R.id.player1Win);
    player2Win = findViewById(R.id.player2Win);
    player3Win = findViewById(R.id.player3Win);
    player4Win = findViewById(R.id.player4Win);

    //set the game type dropdown values for the spinner
    gameType = (Spinner) findViewById(R.id.gameType);
    adapter = new ArrayAdapter<String>(StartRound.this,android.R.layout.simple_list_item_1, getResources().getStringArray(R.array.typeSpel));
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    gameType.setAdapter(adapter);

    //set the game type dropdown values for the spinner
    troef = (Spinner) findViewById(R.id.troef);
    adapterTroef = new ArrayAdapter<String>(StartRound.this,android.R.layout.simple_list_item_1, getResources().getStringArray(R.array.troef));
    adapterTroef.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    troef.setAdapter(adapterTroef);

    //set the game type dropdown values for the spinner
    aantalSlagen = (Spinner) findViewById(R.id.aantalSlagen);
    adapterAantalSlagen = new ArrayAdapter<String>(StartRound.this,android.R.layout.simple_list_item_1, getResources().getStringArray(R.array.aantalSlagen));
    adapterAantalSlagen.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    aantalSlagen.setAdapter(adapterAantalSlagen);

    //on change of game type spinner do something
    gameType.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) {

        }


        @Override
        public void onNothingSelected(AdapterView<?> parentView) {
            // your code here
        }

    });

    // using finsih()
    Button closeButton = (Button) findViewById(R.id.calculateScore);
    closeButton.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            winners[0] = player1Win.isChecked();
            winners[1] = player2Win.isChecked();
            winners[2] = player3Win.isChecked();
            winners[3] = player4Win.isChecked();
            Boolean[] players = new Boolean[4];
            players[0] = player1.isChecked();
            players[1] = player2.isChecked();
            players[2] = player3.isChecked();
            players[3] = player4.isChecked();
            int[] score = new int[4];

            Integer behaaldAantalSlagen = (Integer) Integer.parseInt(aantalSlagen.getSelectedItem().toString());
            String gametypetest = gameType.getSelectedItem().toString();

            switch(gametypetest) {
                //algorithm to define the score based on the gametype. score is added to the array score
            }
            Intent returnIntent = getIntent();
            returnIntent.putExtra("Player1Score", score[0]);
            returnIntent.putExtra("Player2Score", score[1]);
            returnIntent.putExtra("Player3Score", score[2]);
            returnIntent.putExtra("Player4Score", score[3]);
            setResult(RESULT_OK, returnIntent);
            StartRound.this.finish();
        }
    });

}

}

returnIntent 中,您将 Player1Score 作为整数传递。因为 score 是一个 int 数组。

并且在 onActivityResult 中,您将它作为字符串类型获取。像这样data.getStringExtra("Player1Score")。这导致了一个问题。

您需要将其作为 int only.like data.getIntExtra("Player1Score") 获取。然后不需要解析它,因为它已经是 int

我想我现在明白了。我正在尝试在单元化整数上使用 =+。所以最重要的是,当我定义我的整数时,它没有设置为 0。这是游戏的起点。所有玩家的得分都应为 0。

因此,当在整数上使用 += 时,它不是在抱怨意图或数据,而是在抱怨您无法添加到空值整数这一事实。