【问题标题】:Android: How to pass Parcelable object to intent and use getParcelable method of bundle?Android:如何将 Parcelable 对象传递给意图并使用捆绑的 getParcelable 方法?
【发布时间】:2012-04-11 13:58:09
【问题描述】:

为什么 bundle 有getParcelableArrayListgetParcelable 方法;但 Intent 只有 putParcelableArrayListExtra 方法? 我可以只传输一个元素的object<T>,而不是ArrayList吗? 那么,getParcelable 是干什么用的?

【问题讨论】:

    标签: android android-intent bundle parcelable


    【解决方案1】:

    Intent 提供了一堆重载putExtra() 方法。

    假设你有一个类 Foo 正确地实现了 Parcelable,把它放到一个 Activity 的 Intent 中:

    Intent intent = new Intent(getBaseContext(), NextActivity.class);
    Foo foo = new Foo();
    intent.putExtra("foo ", foo);
    startActivity(intent);
    

    从另一个活动的意图中获取它:

    Foo foo = getIntent().getExtras().getParcelable("foo");
    

    希望这会有所帮助。

    【讨论】:

    • 我得到 java.lang.ClassCastException: xxx.CDetails cannot be cast to android.os.Parcelable 其中 CDetails 是一种具有键值对的自定义模型。 intent.putExtra("CDetails", (Parcelable) tempCDetails);
    【解决方案2】:
    Parcelable p[] =getIntent().getParcelableArrayExtra("parcel");
    

    【讨论】:

    • 我问一下 getParcelable ,它是为了什么?
    • 它会返回你传递的对象数组
    • sorry,你觉得getParcelableArrayExtra和getParcelable有什么区别吗?
    • 顺便说一句,你想通过什么?
    • object,T实现Parcelable,只有一个对象,不是数组,不是列表
    【解决方案3】:

    发件人活动:

    val intent = Intent(this, RestaurantDetails::class.java)
            intent.putExtra(Constants.RESTAURANT, restaurant)
            startActivity(intent)
    

    接收者活动:

            val restaurant = intent.getParcelableExtra<Restaurant>(Constants.RESTAURANT)
    
    

    【讨论】:

      【解决方案4】:

      请务必记住,您的模型必须实现 Parcelable 接口和静态 CREATOR 方法。本例适用于列表

       private static final String MODEL_LIST = "MODEL_LIST";
          public MainFragment() {}
      
          public static MainFragment newInstance(ArrayList<YourModel>   
      models) {
              MainFragment fragment = new MainFragment();
              Bundle args = new Bundle();
              args.putParcelableArrayList(MODEL_LIST,models);
              fragment.setArguments(args);
              return fragment;
          }
      
          @Override
          public void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              if (getArguments() != null) {
                  ArrayList<YourModel> models = getArguments().getParcelableArrayList(MODEL_LIST);
              }
          }
      

      【讨论】:

      • OP 询问的是为什么 Intent 上不存在 putParcelable,而不是如何实现 Parcelable。
      【解决方案5】:

      首先使用 Given Technique 创建 Parcelable,然后

      public static CreditCardDetail newInstance(CreditCardItemBO creditCardItem) {
              CreditCardDetail fragment = new CreditCardDetail();
              Bundle args = new Bundle();
              args.putParcelable(CREDIT_KEY,creditCardItem);
              fragment.setArguments(args);
              return fragment;
          }
      

      得到它喜欢

       if(getArguments() != null)
       {
          creditCardItem = getArguments().getParcelable(CREDIT_KEY);               
       }
      

      在哪里

      public static final String CREDIT_KEY = "creditKey";
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-03-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-16
        • 2015-02-03
        • 2013-11-24
        • 1970-01-01
        相关资源
        最近更新 更多