Android Fragment仅在第二次“刷新”后使用edittext的最后一个值

时间:2014-08-06 16:43:50

标签: android android-fragments android-edittext android-linearlayout

我有一个片段,它动态地添加了LinearLayouts,带有两个图像按钮和一个edittext。 edittext中的值存储在.txt文件中,并通过函数retrievecounter进行检索。

这是添加的布局:

<?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="horizontal"
    android:weightSum="100" >

    <ImageButton
        android:id="@+id/imageView1"
        android:layout_width="56dp"
        android:layout_height="50dp"
        android:layout_weight="5"
        android:src="@drawable/ic_action_photo" />

    <EditText
        android:id="@+id/singelfirstet1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="85"
        android:ems="10" >

        <requestFocus />
    </EditText>

    <ImageButton
        android:id="@+id/buttonDelete"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_weight="10"
        android:background="@android:color/transparent"
        android:contentDescription="@string/button_delete_row_description"
        android:src="@drawable/testi" />

</LinearLayout>

这是我的片段:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {


    // Inflate the layout for this fragment

    ScrollView mLinearLayout = (ScrollView) inflater.inflate(
            R.layout.editlistsfirst, container, false);


     operations = new ArrayList<String>();

     operations = retrievecounter(0);


    temp = (LinearLayout) mLinearLayout.findViewById(R.id.lineartest);
    LayoutInflater inflater2 = (LayoutInflater) getActivity()
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);


    for (int i = 0; i < operations.size(); i++) {

        View tempr = (inflater2.inflate(R.layout.list_singlefirst,
                container, false));

        ImageButton bt = (ImageButton) tempr
                .findViewById(R.id.buttonDelete);

        EditText et = (EditText) tempr.findViewById(R.id.singelfirstet1);

        et.setText(operations.get(i));

        String show = et.getText().toString();
        Log.w("Class",show);

        bt.setOnClickListener(this);
        temp.addView(tempr);


    }



    return mLinearLayout;
}

我通过带有标签的操作栏在片段之间导航。

这是我的onTabselected功能:

@Override
public void onTabSelected(Tab tab, FragmentTransaction ft) {
    // TODO Auto-generated method stub


    ft.replace(R.id.fragment_container, fragment);
}

第一次单击时,.txt文件中的值会正确显示,但在切换到不同的选项卡/片段并返回到此片段后,只会显示我的ArrayList的最后一个值。

但奇怪的是,Log.w两次都会显示edittext的正确值。

知道是什么原因引起的吗?

提前致谢

如果我在linearlayout中调用我的按钮功能:

temp.removeView((View) v.getParent());

对于所有按钮,直到所有布局都消失并转到另一个选项卡并返回它显示正确的值,但我不知道为什么。也许这有助于找到问题。

edit2:我找到了一个解决方案,不知道它是否实用或为什么有效但是确实如此:

public void onPause(){
    super.onPause();
    temp.removeAllViews();
}

我添加它之后就可以了。如果有人能解释为什么会非常感激。

1 个答案:

答案 0 :(得分:0)

在处理像这样的视图时要考虑的一件事是它们只在首次创建时才“更新”。当您在选项卡之间切换时,数据将不会刷新,因为它是A)未重新创建[刷新] B)未由适配器更新。

删除Pause()上的所有观看次数后,您清空了视图,然后从replace()功能重新创建,与创建新视图类似。每次更改内容时通过删除和重新添加所有内容来刷新布局可能会变得非常昂贵,这就是为什么人们会使用适配器来控制其布局。