getIntent返回null

3
在Android中,当我尝试使用getIntent()方法时,它返回null,导致应用程序崩溃。以下是我的代码:
public class MainActivity extends AppCompatActivity {

    public final static String EXTRA_MESSAGE = "com.mycompany.myfirstapp.MESSAGE";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    public void sendMessage(View view) {
        Intent intent = new Intent(this, DisplayMessageActivity.class);
        EditText textbox = (EditText) findViewById(R.id.edit_message);
        String message = textbox.getText().toString();
        intent.putExtra(EXTRA_MESSAGE, message.toString());
        startActivity(intent);
    }
}

这个首先调用第二个活动:

public class DisplayMessageActivity extends AppCompatActivity {

    Intent intent = getIntent();


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_display_mesage);

        String message = "";

        if (intent == null) {
            Log.d("Intent", "Intent is null :(");
        }

        try {
            message = intent.getStringExtra(MainActivity.EXTRA_MESSAGE);
        } catch (Exception e) {
            Log.d("Message", "Message is null");
        }


        TextView textView = new TextView(this);
        textView.setText(message);
        textView.setTextSize(40);

        RelativeLayout layout = (RelativeLayout) findViewById(R.id.content);
        layout.addView(textView);
    }
}   

我不明白为什么它会返回null,因为我使用的intent不是null。

编辑:我也尝试过使用常量以外的其他内容作为关键字,比如“message”而不是EXTRA_MESSAGE,但结果一样。


6
Intent intent = getIntent(); 移动到 onCreate 方法内部。 - ρяσѕρєя K
哦...谢谢。这是我在C#中习惯做的事情,没想到在这里行不通。非常感谢你。 - Thomas Kowalski
1
这在那里不起作用,因为像那样的方法外的任何语句都发生在初始化时-当对象被创建时,在构造函数被调用之前。此时,Intent 尚未传递给对象。实际上,你只应该使用这样的初始化器来处理简单的值(如 1、2、"hello" 等)或者使用 new 来创建对象。你不应该调用函数。 - Gabe Sechan
2个回答

1

空值有两个原因。 1)如果您在Android的manifest.xml文件中没有声明activity。 2)您必须在oncreate()方法内使用getIntent(),这是该内容的代码:

public class DisplayMessageActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_display_mesage);

        Intent intent = getIntent();


        String message = "";

        if (intent == null) {
            Log.d("Intent", "Intent is null :(");
        }

        try {
            message = intent.getStringExtra(MainActivity.EXTRA_MESSAGE);
        } catch (Exception e) {
            Log.d("Message", "Message is null");
        }


        TextView textView = new TextView(this);
        textView.setText(message);
        textView.setTextSize(40);

        RelativeLayout layout = (RelativeLayout) findViewById(R.id.content);
        layout.addView(textView);
    }
}   

0

getIntent()方法必须在setContentView()方法之后调用

public class DisplayMessageActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_display_mesage);

    Intent intent = getIntent();
    String message = "";

    if (intent == null) {
        Log.d("Intent", "Intent is null :(");
    }

    try {
        message = intent.getStringExtra(MainActivity.EXTRA_MESSAGE);
    } catch (Exception e) {
        Log.d("Message", "Message is null");
    }


    TextView textView = new TextView(this);
    textView.setText(message);
    textView.setTextSize(40);

    RelativeLayout layout = (RelativeLayout) findViewById(R.id.content);
    layout.addView(textView);
}

}


为什么必须在setContentView()之后调用getIntent()? - John Glen
哦,原来你会用findViewById()啊!我很确定在那之前你可以获取到intent。 - John Glen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接