【问题标题】:Android - How do I manage multiple instances of a single fragment with different content?Android - 如何管理具有不同内容的单个片段的多个实例?
【发布时间】:2013-11-03 20:07:56
【问题描述】:

我希望能够设置单个片段的视图的 setText 和 getText。就像现在一样,当我设置 Framgent 的 TextView 的文本时,它会更改所有片段中该视图的文本。

我一直在尝试移动东西,但这是我目前的代码:

片段类

public class TestFragment extends Fragment{

    View view;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
    Bundle savedInstanceState) {
        view = inflater.inflate(R.layout.test_fragment, container, false);
        TextView tv = (TextView) view.findViewById(R.id.huh);
        //tv.setText("AAAAAAAAAAAAAAAAAAA");

        return view;
    }

    public void setText(String asdf) {
        TextView test = (TextView) view.findViewById(R.id.huh);
        test.setText(asdf);
    }


}

活动类

    public class Manage extends BaseActivity {
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.manage);

        FragmentManager fragmentManager = getSupportFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        TestFragment fragment = new TestFragment();
        //fragment.setText("ASDF");
        fragmentTransaction.add(R.id.test_fragment, fragment, "testtag");
        fragmentTransaction.commit();
    }
}

framgent.xml 非常简单;只有一个 TextView。

【问题讨论】:

  • 你绝对可以独立使用同一个片段类的多个实例。您需要向我们展示您的代码,以便我们可以帮助您解决您的特定问题。

标签: java android android-fragments


【解决方案1】:

使用名为 tag 的参数将片段添加到堆栈中。在您的情况下,您已经添加了带有“testtag”的片段。

fragmentTransaction.add(R.id.test_fragment, fragment, "testtag");

如果您创建相同片段的多个实例并使用唯一标签添加它们,那么您可以使用该唯一标签获取它们。当你得到一个片段时,你就可以到达它的内容。

FragmentManager fm = this.getSupportFragmentManager();
Fragment testtagFragment = fm.findFragmentByTag("testtag"); 
View targetView = testtagFragment.getView().findViewById(R.id.anyViewInsideContentOfYourFragment);

编辑:

我希望能够设置个人视图的 setText 和 getText 片段。

这个问题有 2 个部分。

  1. 要在初始化时设置文本,您必须传递您的初始值 在创建其实例时为您的片段提供参数。我建议 您为此使用静态newInstance 方法。 See sample here
  2. 要获取文本,请阅读我上面的答案。请注意,您可以在片段的onCreateView 方法执行后获取片段的内容。因此,如果您尝试在活动 onCreate 方法中调用片段的 getView 方法(在添加片段之后),那将返回 null。您可以在单击事件下成功获取其内容以进行测试,并对该片段的内容使用任何视图的 get 或 set 操作。

【讨论】:

  • 谢谢,看起来不错,但我现在遇到了另一个问题。我的目标是 Android 2.3,所以我使用的是android.support.v4.app。我已经导入了 android.support.v4.app.* 但那个版本的 FragmentTransaction 没有 findFragmentById()。
  • 对不起我的错误。您可以从 fragmentManager 获取片段。我已经编辑了我的答案。
  • 'View targetView = testtagFragment.getView()' 给我一个运行时错误 (984)
  • 请分享你的logcat。 getView 是获取片段内容视图的正确方法。请参阅文档:developer.android.com/reference/android/app/…。分享您的 logcat 输出。
  • pastebin.com/gJNvBf2T 它只发生在 getView() 我将它和 findFragmentByTag 都包装在一个 try 块中,但它仍然显示未捕获的异常
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-27
  • 2016-05-10
  • 2014-07-01
相关资源
最近更新 更多