【问题标题】:Send a fragment to an activity将片段发送到活动
【发布时间】:2015-03-11 21:44:43
【问题描述】:

有没有办法将片段发送到活动?或者有没有更好的实现方法适合我的使用?

我有一个 gameOneFrag 和 gameTwoFrag。

例如:从一个片段中,我想在一个活动中打开其中一个(取决于在片段中按下了哪个按钮)。我可以做一个 FragmentTransaction 并用任何游戏片段替换当前片段。但我更愿意打开一个新的活动“GameActivity”,并发送一个游戏片段作为额外的东西。

我在想这样的事情:

    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            //listView.getItemAtPosition(position).getFrag() instead of ;
            Intent intent = new Intent(getActivity(), GameActivity.class);
            intent.putExtra("GAME_TYPE", gameOneFrag );
            startActivity(intent);
        }

比在 GameActivityFragment 中

    Fragment frag = getIntent().getExtras().getFragment("GAME_TYPE");
    if (savedInstanceState == null) {
        getSupportFragmentManager().beginTransaction()
                .add(ff.getId(), frag)
                .commit();
    }

或者我真的必须让每个游戏都成为一个活动并一起跳过 GameActivity“容器”吗?

值得一提的是,我有一个游戏类,我打算在其中存储片段。例如

Game one = new Game(new GameOneFragment());

我以后可以调用 one.getFragment();

【问题讨论】:

标签: android fragment


【解决方案1】:

您不能将Fragment 作为Intent 额外传递。相反,您可以传递一个标志。在您的第一个 Activity 中,定义一些常量。

public static final int FRAG_ONE = 0;
public static final int FRAG_TWO = 1;

当您确定要打开第二个Activity 时,请通过Intent 发送一个常量。

intent.putExtra("GAME_TYPE", FRAG_ONE);

在您的第二个Activity 中,您可以检索Intent 额外内容。

int flag = getIntent().getIntExtra("GAME_TYPE", 0);

现在您知道要加载哪个Fragment。 switch 语句非常适合这一点。

switch (flag) {

    case ActivityOne.FRAG_ONE:

        loadFragmentOne();

        break;

    case ActivityOne.FRAG_TWO:

        loadFragmentTwo();

        break;

    default:

        Log.e(getClass().getName(), "Could not load Fragment");


}

在我看来,我建议只用游戏Fragment 替换容器,而不是开始一个新的Activity,尽管你说过你不想这样做。

祝你好运,编码愉快!

【讨论】:

  • 过去,我通过了一个作为 Parcelable 的类,这是一个 Fragment 工厂。这很奇怪。
  • @EpicPandaForce 哇!我什至不知道这是可能的。我更喜欢使用标志。这样,只有原始数据与Intent 一起传递。该标志可以在活动的 onCreate() 中读取,并且可以在其中添加Fragment
  • 有可能,但并不漂亮。毕竟,我是通过本地广播管理器将它作为Parcelable 发送的。我现在宁愿使用Otto,它更简单:)
  • 我只是试图让我的 Fragment Parcelable 呵呵。比我尝试使用 Gson 发送包含片段的 obj,但显然我无法发送包含片段的对象,尽管尝试过:P ... 带有标志的非常干净的解决方案,我实际上倾向于类似的东西,但希望有所收获这将省略硬编码 switch 语句,但对于解决方案的简洁性来说是一个加分项。
  • 打开的片段位于带有滑动标签的浏览器中,因此更换容器会使事情变得复杂。我可以让 gameOneFragment 成为一个活动,而不是将该活动存储在我的游戏对象中。但是将片段或活动存储在对象中真的很好吗?
猜你喜欢
  • 1970-01-01
  • 2014-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多