getExtras()中的错误?

时间:2016-05-02 15:08:32

标签: android android-intent android-activity

我需要在if-statement中设置2个条件(如果这个或这个),第一个部分从item获取listview,另一个if - part得到第一个activity的值,如果它是true那么条件需要。请参阅下面的2个代码,可能会更好地解释它。

putExtra代码

@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

    TextView thisTextView = (TextView)view.findViewById(R.id.listview_item_title);
    String text = (String)thisTextView.getText();

    if (text.equals("Category")) {

        Intent i = new Intent(Search.this,MainActivity.class);
        i.putExtra("sendData", 1);
        startActivity(i);           
    }
}

getExtra Code

public class MainActivity extends Activity implements OnItemClickListener{

//private boolean mainSub,manuSub = false;
private int mainSub=0;
ListView lv;
String [] list;
int mine;

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

    lv = (ListView)findViewById(R.id.listView);
    list = getResources().getStringArray(R.array.main);

    lv.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, list));
    lv.setOnItemClickListener(this);

    Intent myIntent = getIntent();
    mine = myIntent.getExtras().getInt("sendData");
}

@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
        long id) {

    Intent i = new Intent(MainActivity.this, SwipeActivity.class);

    if (lv.getItemAtPosition(position).toString().equalsIgnoreCase("Search")){
        i = new Intent(MainActivity.this, Search.class);
        startActivity(i);
    } 
    else if (lv.getItemAtPosition(position).toString().equalsIgnoreCase("Category")  || mine == 1) {
        lv.setAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,getResources().getStringArray(R.array.Category)));
        mainSub = 1;
 }

我将putExtra(name,value)的参数设为name=sendData value = 1。然后,当我试图获得Intent时,程序会给出一个异常但没有启动。我知道错误出现在getExtras行 - &gt; mine = myIntent.getExtras().getInt("sendData");但实际上我不知道为什么它似乎是一个错误。因为我认为编码的每一个想法都没问题。

logcat的

05-02 18:06:05.218: D/SecWifiDisplayUtil(11595): Metadata value : none
05-02 18:06:05.293: D/PhoneWindow(11595): *FMB* installDecor mIsFloating : false
05-02 18:06:05.293: D/PhoneWindow(11595): *FMB* installDecor flags : 8454400
05-02 18:06:05.298: D/AbsListView(11595): Get MotionRecognitionManager
05-02 18:06:05.303: E/MotionRecognitionManager(11595): mSContextService = android.hardware.scontext.ISContextService$Stub$Proxy@8bebba7
05-02 18:06:05.303: E/MotionRecognitionManager(11595): motionService = com.samsung.android.motion.IMotionRecognitionService$Stub$Proxy@208cf854
05-02 18:06:05.303: E/MotionRecognitionManager(11595): motionService = com.samsung.android.motion.IMotionRecognitionService$Stub$Proxy@208cf854
05-02 18:06:05.308: D/AndroidRuntime(11595): Shutting down VM
05-02 18:06:05.308: E/AndroidRuntime(11595): FATAL EXCEPTION: main
05-02 18:06:05.308: E/AndroidRuntime(11595): Process: com.example.shaymatest, PID: 11595
05-02 18:06:05.308: E/AndroidRuntime(11595): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.shaymatest/com.example.shaymatest.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'int android.os.Bundle.getInt(java.lang.String)' on a null object reference
05-02 18:06:05.308: E/AndroidRuntime(11595):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3149)
05-02 18:06:05.308: E/AndroidRuntime(11595):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3248)
05-02 18:06:05.308: E/AndroidRuntime(11595):    at android.app.ActivityThread.access$1000(ActivityThread.java:197)
05-02 18:06:05.308: E/AndroidRuntime(11595):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1681)
05-02 18:06:05.308: E/AndroidRuntime(11595):    at android.os.Handler.dispatchMessage(Handler.java:102)
05-02 18:06:05.308: E/AndroidRuntime(11595):    at android.os.Looper.loop(Looper.java:145)
05-02 18:06:05.308: E/AndroidRuntime(11595):    at android.app.ActivityThread.main(ActivityThread.java:6872)
05-02 18:06:05.308: E/AndroidRuntime(11595):    at java.lang.reflect.Method.invoke(Native Method)
05-02 18:06:05.308: E/AndroidRuntime(11595):    at java.lang.reflect.Method.invoke(Method.java:372)
05-02 18:06:05.308: E/AndroidRuntime(11595):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1404)
05-02 18:06:05.308: E/AndroidRuntime(11595):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1199)
05-02 18:06:05.308: E/AndroidRuntime(11595): Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'int android.os.Bundle.getInt(java.lang.String)' on a null object reference
05-02 18:06:05.308: E/AndroidRuntime(11595):    at com.example.shaymatest.MainActivity.onCreate(MainActivity.java:35)
05-02 18:06:05.308: E/AndroidRuntime(11595):    at android.app.Activity.performCreate(Activity.java:6550)
05-02 18:06:05.308: E/AndroidRuntime(11595):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1120)
05-02 18:06:05.308: E/AndroidRuntime(11595):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3102)
05-02 18:06:05.308: E/AndroidRuntime(11595):    ... 10 more
05-02 18:06:05.368: I/Process(11595): Sending signal. PID: 11595 SIG: 9

3 个答案:

答案 0 :(得分:1)

当MainActivity的Intent没有额外功能时(例如首次启动应用程序时),您的代码将崩溃。

因此,您需要检查是否有额外的内容。

Bundle extras = getIntent().getExtras();
if (extras != null) {
    mine = extras.getInt("sendData");
}

或者,您可以使用getIntent().getIntExtra("sendData", -1),其中-1是某个默认值。

答案 1 :(得分:0)

而不是使用getExtras().getInt使用getIntExtra

答案 2 :(得分:0)

可以通过几种方式启动活动。

1)由启动器启动(您可以在清单文件中验证这一点)

2)以意图开始。

当它由启动器启动时,则mIntent为null。 尝试从中检索额外内容将导致NullPointerException。

我的假设是MainActivity也是您的启动器活动。 如果是这样,那么你应该在使用之前检查mIntent == null。