【问题标题】:Parcel: unable to marshal value android.widget.RelativeLayoutParcel:无法编组值 android.widget.RelativeLayout
【发布时间】:2016-11-04 05:42:50
【问题描述】:

我想在 ResultActivity.class 中传递的数据类型(ViewGroup 的 ArrayList)有问题。这个 ViewGroup 包含一个通过 xml 创建的布局块。

其中一个块已经存在于 IPActivity 类管理的主布局中,它在 java 代码中的名称是 mFirstBlock。在我在 arrayList 中插入 mFirstBlock 之后。然后用户可以用一个按钮添加一个相等的新块。我在arrayList中添加了所有这些块。

这是布局文件:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">
    <TextView
        android:id="@+id/textView_link_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        ...

    <EditText
        ...

    <TextView
        ...

    <EditText
        ...

    <ImageButton
        ...

</RelativeLayout>

这是java代码:

public class IPActivity extends AppCompatActivity {

    private static final String EXTRA_BLOCKS = "...";

    ArrayList<ViewGroup> mBlockLinks; //contiene i blocchi (i link con le info)

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        final LinearLayout myContainer = (LinearLayout) findViewById(R.id.my_container); //layout presente nell'mainLayout
        mBlockLinks = new ArrayList<>();

        mFirstBlock = (ViewGroup) findViewById(R.id.first_block);//R.id.first_block is the id layout of the block that I include in main Layout
        mDeleteLink = (ImageButton) mFirstBlock.findViewById(R.id.imageButton_delete_link);
        mDeleteLink.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                myContainer.removeView((View) v.getParent());
                mBlockLinks.remove( v.getParent());
            }
        });

        mBlockLinks.add(mFirstBlock);

        mAddLink = (Button) findViewById(R.id.button_add_link);
        mAddLink.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                ViewGroup new_block = (ViewGroup) LayoutInflater.from(v.getContext()).inflate(R.layout.layout_block_input, myContainer, false);
                myContainer.addView(new_block);
                mBlockLinks.add(new_block);

                mDeleteLink = (ImageButton) new_block.findViewById(R.id.imageButton_delete_link);
                mDeleteLink.setOnClickListener(new OnClickListener() {
                    //cancello il link relativo al bottone
                    @Override
                    public void onClick(View v) {
                        myContainer.removeView((View) v.getParent());
                        mBlockLinks.remove( v.getParent());
                    }
                });

            }
        });

        mResult = (Button) findViewById(R.id.button_subnetting);
        mResult.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(v.getContext(),ResultActivity.class);
                intent.putExtra(EXTRA_BLOCKS,mBlockLinks);
                startActivity(intent); //the line where appear the Exception
            }
        });
    }
}

我只写了对我来说最重要的代码来解决这个问题。

Logcat 错误如下:

FATAL EXCEPTION: main
java.lang.RuntimeException: Parcel: unable to marshal value android.widget.RelativeLayout{42763ed8 V.E..... ......I. 0,176-656,352}
  at android.os.Parcel.writeValue(Parcel.java:1235)
  at android.os.Parcel.writeList(Parcel.java:622)
  at android.os.Parcel.writeValue(Parcel.java:1195)
  at android.os.Parcel.writeMapInternal(Parcel.java:591)
  at android.os.Bundle.writeToParcel(Bundle.java:1646)
  at android.os.Parcel.writeBundle(Parcel.java:605)
  at android.content.Intent.writeToParcel(Intent.java:7353)
  at android.app.ActivityManagerProxy.startActivity(ActivityManagerNative.java:2222)
  at android.app.Instrumentation.execStartActivity(Instrumentation.java:1436)
  at android.app.Activity.startActivityForResult(Activity.java:3464)
  at android.app.Activity.startActivityForResult(Activity.java:3425)
  at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:842)
  at android.app.Activity.startActivity(Activity.java:3661)
  at android.app.Activity.startActivity(Activity.java:3629)
  at giusso.simone.indirizzamentoipsubnettingrete.IPActivity$5.onClick(IPActivity.java:122)
  at android.view.View.performClick(View.java:4475)
  at android.view.View$PerformClick.run(View.java:18786)
  at android.os.Handler.handleCallback(Handler.java:730)
  at android.os.Handler.dispatchMessage(Handler.java:92)
  at android.os.Looper.loop(Looper.java:176)
  at android.app.ActivityThread.main(ActivityThread.java:5419)
  at java.lang.reflect.Method.invokeNative(Native Method)
  at java.lang.reflect.Method.invoke(Method.java:525)
  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1046)
  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:862)
  at dalvik.system.NativeStart.main(Native Method)

我阅读了很多问题,其中问题是通过可序列化接口解决的,该接口用于为新活动传递的类,但在这种情况下,我不知道解决此问题的方法。

感谢您的帮助!

【问题讨论】:

    标签: android android-layout serializable parcel


    【解决方案1】:

    您不能在活动之间传递视图,例如 ViewGroup

    如果这些活动紧密耦合,请使用片段或其他技术将它们组合成一个活动。

    【讨论】:

    • 我有一个活动来获取 ViewGroup 的输入。我想在新活动中传输此输入以进行计算,然后显示结果。也许我必须用 ViewGroup 的所有输入来上课?这可能是一个很好的解决方案?
    • @Chuck94:“我想在新活动中传输此输入以进行计算然后显示结果”-“输入”不是视图。输入以字符串(例如,用户在EditText 中键入的内容)、布尔值(例如,CheckBox 的状态)等形式出现。欢迎您将该输入(字符串、布尔值等)传递给其他活动。
    • 对不起,我指的是EditText。因此,我有两个指向对象的 EditText 输入。我不想创建两个字符串数组。也许最好用一个获取 EditText 输入的 costructor 创建一个新类。例如:
      公共类结果实现serializable(如有必要){
      String editTextinput1;
      字符串editTextinput2;
      公共结果(字符串输入1,字符串输入2){
      editTextinput1 = input1;
      editTextinput2 = input2} ... }。我的想法更清楚了?
    • @Chuck94:使用两个额外的字符串而不是一个会更简单。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-13
    • 2015-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多