在Fragment中使用EditText自定义LinearLayout

时间:2015-09-16 06:21:23

标签: android android-layout android-fragments

如果你按照下面提到的那样逐步完成,你会理解我的问题(对不起,但我不能以其他方式让你理解)。这可能会令人困惑。但是,我相信如果你读过一次,你就会理解。

  1. 创建一个新的android项目,然后创建两个片段。你现在会 有

    一个。 MainActivity.java。

    湾FirstFragment(FirstFragment.java)和它的xml       文件(first_fragment.xml)。

    ℃。 SecondFragment(SecondFragment.java)和它的xml       文件(second_fragment.xml)。

  2. 现在创建一个自定义linearLayout类(FormRow.java),如下所示:

    public class FormRowNew extends LinearLayout {
        public FormRowNew(Context context, AttributeSet attrs) {
            super(context, attrs);
            initView();
        }
    
        private void initView() {
            View.inflate(getContext(), R.layout.form_row, this);
        }
    }
    

    xml文件(form_row)就像这样:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout    
             xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="match_parent"
              android:layout_height="wrap_content"
              android:orientation="vertical">
    
         <EditText
             android:id="@+id/editText"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
             android:text="eeeee"/>
    </LinearLayout>
    

    在FirstFragment中使用此自定义线性类TWICE,如下所示:

    <gallery.com.yyyyyyyyy.FormRow
        android:id="@+id/first"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/txvFirst"
        >
    </gallery.com.yyyyyyyyy.FormRow>
    
    <gallery.com.yyyyyyyyy.FormRow
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/first"
        >
    </gallery.com.yyyyyyyyy.FormRow>
    

    记住:我已经使用过两次了。你也至少使用它两次。

    现在,在MainActivity.java中加载一些id(rlRootLayout)的FirstFragment,如下所示。

    FirstFragment firstFragment = new FirstFragment();
    getSupportFragmentManager().beginTransaction().addToBackStack(null)                                                                       
    .replace(R.id.rlRootLayout, firstFragment).commit();
    

    同样,从FirstFragment中加载相同ID(rlRootLayout)的Second Fragment,如下所示。

    secondFragment blankFragment = new secondFragment();
    getActivity().getSupportFragmentManager().beginTransaction()
    .addToBackS tack(null).replace(R.id.rlRootLayout, blankFragment)
    .commit();  
    

    这里我将FirstFragment添加到FirstFragment的MainActivity中 在ID(rlRootLayout)。

    问题: - 运行应用程序并转到上述页面:

     MainActivity -> 
     FirstFragment -> 
     Change something in BOTTOM FormRow(like add some text in EditText) ->
     SecondFragment ->
     FirstFragment.
    

    现在,请参阅FirstFragment中的自定义类(FormRow)。 无论我们在底层FormRow类中添加了什么,都会自动添加到Top FormRow中。我无法找到发生这种情况的原因。即使我没有对顶级FormRow做任何事情,当我从SecondFragment回来时它会根据底部变化。 请帮忙。

2 个答案:

答案 0 :(得分:1)

在添加第二个片段时将文本保存在editText中。然后设置这些保存的文本,同时从第二个回到第一个

@Override
public void onViewStateRestored(@Nullable Bundle savedInstanceState) {
    super.onViewStateRestored(savedInstanceState);
    //set edit text
}

被召唤。

答案 1 :(得分:1)

这种行为是因为EditText的身份。当第一个片段在从第二个片段返回时对布局进行膨胀时,它会使用它来分配值以编辑文本。所以在这种情况下,EditText的{​​id}具有相同的id,因此它为两个Edittexts的

分配相同的值