【问题标题】:Passing ArrayList of values between two activities.. Error在两个活动之间传递值的 ArrayList .. 错误
【发布时间】:2017-01-08 10:00:24
【问题描述】:

我尝试在两个活动之间传递值的 ArrayList,但出现如下错误。提前致谢

原因:java.lang.NullPointerException:尝试在 com.example.android.myapplication.DetailActivity.getextras1 的空对象引用上调用虚拟方法 'android.os.Bundle android.content.Intent.getExtras()' (DetailActivity.java:35) 在 com.example.android.myapplication.MyService.onStartCommand(MyService.java:38) 在 android.app.ActivityThread.handleServiceArgs(ActivityThread.java:3180) 在 android.app.ActivityThread.access$2200 (ActivityThread.java:182) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1595) 在 android.os.Handler.dispatchMessage(Handler.java:111) 在 android.os.Looper.loop(Looper. java:194) 在 android.app.ActivityThread.main(ActivityThread.java:5763) 在 java.lang.reflect.Method.invoke(Native Method) 在 java.lang.reflect.Method.invoke(Method.java:372)在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:960) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)

用于调用其他活动的代码

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

  String[] appdescription =  getResources().getStringArray(R.array.appdescriptionname);
  final String appdescipl = appdescription[position];
  final int imagesList =  noImagesList[position];
  final int imagesList2 = noImagesList2[position];

  Intent intent1 = new Intent(getApplicationContext(), DetailActivity.class);
  intent1.putExtra("des","mydes");
  intent1.putExtra("appdescipl" , appdescipl);
  intent1.putExtra("imagesList",imagesList);
  intent1.putExtra("imagesList2",imagesList2);
  startActivity(intent1);
     }
});

详细活动

public class DetailActivity extends Activity {



@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.detail_activity);
    this.getextras1();
    this.getdescriptionofapp1();
    this.getImage1ofapp1();
    this.getImage2ofapp1();
    startService(new Intent(this, MyService.class));


}


public Bundle getextras1() {
    Bundle extras1 = getIntent().getExtras();
    return extras1;
}

public TextView getdescriptionofapp1() {
    TextView descriptionofapp1 = (TextView) findViewById(R.id.descriptionofapp);
    return descriptionofapp1;
}

public ImageView getImage1ofapp1() {
    ImageView image1ofapp1 = (ImageView) findViewById(R.id.image1);
    return image1ofapp1;
}

public ImageView getImage2ofapp1() {
    ImageView image2ofapp1 = (ImageView) findViewById(R.id.image2);
    return image2ofapp1;
}




}

我的服务

public class MyService extends Service {


public String description;
public int image1;
public int image2;


@Nullable
@Override
public IBinder onBind(Intent intent) {
    return null;
}

public void onCreate() {
    super.onCreate();

}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {

    DetailActivity i ;
    i = new DetailActivity();
    Bundle extras = i.getextras1();
    TextView descriptionofapp = i.getdescriptionofapp1();
    ImageView image1ofapp  = i.getImage1ofapp1();
    ImageView image2ofapp = i.getImage2ofapp1();



    if ( extras.containsKey("des")){

        description = extras.getString("appdescipl");
        descriptionofapp.setText(description);
        image1 = extras.getInt("imagesList");
        image1ofapp.setImageResource(image1);
        image2 = extras.getInt("imagesList2");
        image2ofapp.setImageResource(image2);
    }

    else if (extras.containsKey("data")){
        description = extras.getString("appdatadescipl");
        descriptionofapp.setText(description);
        image1 = extras.getInt("imagesOfLists");
        image1ofapp.setImageResource(image1);
        image2 = extras.getInt("imagesOfLists2");
        image2ofapp.setImageResource(image2);
    }

    this.onDestroy();
    return START_STICKY;
}


@Override
public void onDestroy() {

    this.stopSelf();
}
}

【问题讨论】:

    标签: android android-intent


    【解决方案1】:

    问题来了

    DetailActivity i ;
    i = new DetailActivity();
    Bundle extras = i.getextras1();
    

    您正在创建 Activity 的新 instance 类,但您在 Activity 的另一个 instance 中分配了您的 bundle

    您可以将bundle 传递给您的服务,在服务中使用intentgetExtraputExtra 方法来提取它。

    使用接收器从服务中更新您的视图。你的方法是错误的。

    看看那里 Android update activity UI from service

    【讨论】:

      【解决方案2】:

      为每个对象使用特定的 putextra :

      intent1.putStringExtra("des","mydes");
      intent1.putStringExtra("appdescipl" , appdescipl);
      intent1.putIntExtra("imagesList",imagesList);
      intent1.putIntExtra("imagesList2",imagesList2);
      

      然后在DetailActivity中使用相等的getExtra

      getIntent().getStringExtra("des");
      getIntent().getStringExtra("appdescipl");
      getIntent().getIntExtra("imagesList");
      getIntent().getIntExtra("imagesList2");
      

      希望对你有帮助。

      【讨论】:

        【解决方案3】:

        最好将 Parcelable Object 用于多个参数。 假设你有一个类 Foo 正确实现了 Parcelable ,把它放到一个 Activity 的 Intent 中:

        Intent intent = new Intent(getApplicationContext(), DetailActivity.class);
        Foo foo = new Foo();
        intent.putExtra("foo ", foo);
        startActivity(intent);
        

        从 DetailActivity 的意图中获取它:-

        Foo foo = getIntent().getExtras().getParcelable("foo");
        String appDisc = foo.getDisc();
        int appImage1 = foo.getImage1();
        int appImage2 = foo.getImage2();
        ....
        

        希望对你有所帮助。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-11-23
          • 2013-07-30
          • 1970-01-01
          • 2016-04-05
          • 2012-08-29
          • 2013-05-12
          • 1970-01-01
          • 2023-03-23
          相关资源
          最近更新 更多