我可以将setText限制在单个片段的范围内吗?

时间:2017-11-02 21:58:07

标签: android android-fragments

在我的应用中,我有多个相同片段的实例ActivityFragment。在每个片段中,都有一个activity_text文本视图。将片段添加到布局后,我想在activity_text期间在该片段中设置onCreate textview。但是,当我尝试执行此操作时,屏幕上的每个ActivityFragment都会更改activity_text文本视图。

有没有什么方法可以将setText限制在单个片段的范围内而不为每个片段使用唯一的标签或ID?

这是我的ActivityFragment类:

public static class ActivityFragment extends Fragment {
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable final ViewGroup container, Bundle savedInstanceState) {
        final View fragment1 = inflater.inflate(R.layout.activity_fragment, container, false);

        final TextView activityText = (TextView) fragment1.findViewById(R.id.activity_text);
        //Calling setText changes the activityText Textview in every fragment onscreen
        activityText.setText(text);


        return fragment1;
    }
}

这是我的MainActivity类:

public class MainActivity extends FragmentActivity {
    Static String text;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        for (int i = 0; i != 5; i++) {
            //This ensures each fragment receives a unique String
            text = "success" + i;
            ActivityFragment myFragment = new ActivityFragment();
            getFragmentManager().beginTransaction()
                    .add(R.id.fragment_container, myFragment).commit();
        }
    }
}    

2 个答案:

答案 0 :(得分:1)

您的代码看起来有两个问题。

首先,您使用// WILL NOT WORK if (o1.getClass().equals(o2.getClass()) { // two Cars or two Apples int x = comparison(o1.getClass(), o1, o2); System.out.println(x); ) static <T extends Comparable<T>> int comparison(Class<T> type, T o1, T o2) { return type.cast(o1).compareTo(type.cast(o2)); } 将活动信息传输到碎片。一般来说,这不是一个好主意;如果您需要在构建时将某些内容从“活动”传递到“碎片”,则应使用static String text来执行此操作。

第二,你似乎对Fragment.setArguments(Bundle)的时间有误解。您的FragmentTransaction循环会更改for的值,然后text将新片段更改五次。但这些事务是异步的,片段生命周期有自己的时间轴。因此,在您的活动.commit()完成后,您的onCreateView()实际上会被调用,因此您的五个片段中的每一个都会从onCreate()获得相同的值。

以下是我如何解决它:

text

答案 1 :(得分:1)

您的问题与textview的范围无关。 每个片段都单独将textView设置为text,正如您指示他们这样做的那样。之所以发生这种情况,是因为在所有片段事务发生之后,onCreateView被调用了很多。

在您的代码中,您放置了评论://This ensures each fragment receives a unique String,实际上,没有什么可以确保片段正在接收任何内容。我建议你阅读static在Java中的含义。在for-loop上,您连续5次更改text的值,最后一个值为&#34; success4&#34;。

将参数传递给片段的正确方法是通过Bundle添加调用方法setArguments(Bundle)

我搜索过这里的答案https://stackoverflow.com/a/35737232/906362非常清楚地说明了如何做到这一点。要点是这样的:

    for (int i = 0; i != 5; i++) {
        ActivityFragment myFragment = new ActivityFragment();
        Bundle b = new Bundle();
        // This really ensures each fragment receives a unique String
        b.putString("text", "success" + i)
        myFragment.setArguments(b);
        getFragmentManager().beginTransaction()
                .add(R.id.fragment_container, myFragment).commit();
    }

然后在片段上获取此值:

  TextView activityText = (TextView) fragment1.findViewById(R.id.activity_text);
  activityText.setText(getArguments().getString("text");