【问题标题】:How to Create CREATOR inside interface which extends Parcelable?如何在扩展 Parcelable 的接口内创建 CREATOR?
【发布时间】:2018-02-13 13:06:43
【问题描述】:

第一次尝试时,应用运行良好。但是在重新创建 HomeActivity 之后,我遇到了异常 android.os.BadParcelableException: Parcelable protocol requires an Parcelable.Creator object called CREATOR on class

现在我对如何以及在哪里创建 CREATEOR 感到困惑?

这是我的界面。

public interface OnRefreshListener extends Parcelable { 
    void refresh();
}

这是我的活动。

public class HomeActivity extends AppCompatActivity {
  private OnRefreshListener refreshListener;

 @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_home);
    refreshListener = new OnRefreshListener() {

        @Override
        public int describeContents() {
            return 0;
        }

         @Override
        public void writeToParcel(Parcel parcel, int i) {}

        @Override
        public void refresh() {
            // my code
        }
    };
  }
}

这是我的片段

public class TestFragment extends Fragment {

public static TestFragment newInstance(OnRefreshListener refreshListener) {
 TestFragment testFragment = new TestFragment();
 Bundle bundle = new Bundle();
 bundle.putParcelable("onRefreshListener",refreshListener);
 testFragment.setArguments(bundle);
 return testFragment;
}
.
.
.
}

【问题讨论】:

  • 在什么奇怪的场景下你需要一个可打包的监听器?
  • 通过捆绑为我的片段设置参数我需要它@Tim castelijns
  • 为什么需要通过 bundle 将监听器传递给片段?
  • 我只是给出了代码示例。真实代码不同,但场景相同。
  • 如果场景相同,那么我的问题仍然存在 - 为什么要通过捆绑包传递侦听器?

标签: java android


【解决方案1】:

您的侦听器不应实现 Parcelable。 删除它,您的代码应该可以工作。

【讨论】:

    【解决方案2】:

    首先,你以错误的方式使用 Parcelable,它是用于在 android 组件之间解析数据。请阅读here。所以不要用 Parcelable 接口扩展监听器。

    如果您想要一种简单的方法来更新 ViewPager 中的其他片段,我通常使用EventBus

    你可以有一个像下面这样的 POJO;

    public class UpdateViewPagerUIEvent() {
        // you can have any values you need to parse here
    }
    

    然后在您的按钮上单击将事件发布到总线;

    EventBus.getDefault().post(new UpdateViewPagerUIEvent());
    

    然后在其他片段上监听事件;

    @Subscribe
    public void onViewPagerUIEvent(UpdateViewPagerUIEvent event) {
        // do what ever you want here
    }
    

    如果您在所有片段上都有刷新按钮,则可以在同一片段上发布和收听

    【讨论】:

      猜你喜欢
      • 2013-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-06
      • 1970-01-01
      • 2012-09-01
      • 2023-04-06
      相关资源
      最近更新 更多