我怎样才能逐个标记?

时间:2015-01-05 17:54:30

标签: android android-activity android-fragments android-fragmentactivity

我发现了很多关于此的问题,但这些都不能帮助我。

我有一个" MainActivity"有4个片段。

我需要访问其中一个片段,称为" my_fragment",在另一个简单的活动中,让我们调用" SecondActivity"。

所以,我尝试将属性设置为android:tag =" my_fragment"在" my_fragment"的LinearLayout标记XML中。 之后,我在" SecondActivity":

中这样做

片段frg = getFragmentManager()。findFragmentByTag(" my_fragment");

...为了得到我的片段。但是frg总是空的。

我尝试了很多其他方法,但徒劳无功。这个似乎更好,更容易做,但也许我错了。

任何帮助都会受到赞赏。提前谢谢。

法比安

修改

由于您的回答表明不可能,我想说明我需要的内容。 我只是想让这个片段重新加载它。我在Stackoverflow上找到了类似的东西:

    frg= getFragmentManager().findFragmentByTag(my_fragment);
    final FragmentTransaction ft = getFragmentManager().beginTransaction();
    ft.detach(frg);
    ft.attach(frg);
    ft.commit(); 

顺便说一句,我只是尝试自己在片段中获取片段,它仍然返回null。使用方法:

findFragmentById(R.layout.my_fragment)

它的结果相同。

之后,我做了:

findFragmentById(this.getId())

但它是一个无限的活跃,我不明白原因...

EDIT2

好的,让我们提供一些细节:

我的ViewAager的MainActivity有4个片段。它不是xml意义上的碎片。对不起,如果我很困惑,我最近在Android上接受培训,而且有些事情对我来说还不清楚。所以,在昨天和@Bruce编辑之前,我认为片段是ViewPager的组件。所以,@ Bruce,这就是为什么我不能使用你的解决方案。我试图在我的片段的主要LinearLayout标记上使用findFragmentByTag和标签应用 - 我重复一遍,这是一个xml标记片段。

这是我的方法: 在我的MainActivity中,我点击了第三个片段。我做了一个研究,找到了我周围的一些观点。在用户的操作之后,仍然从第三个片段开始,我打开SecondActivity进行身份验证,在用户连接上,我关闭了这个SecondActivity。现在,我需要重新加载第四个片段,它将根据用户情况调整其组件,同时在第三个片段上保持相同的状态,并加载点。这就是为什么不能使用你的解决方案@ menion.asamm:我无法重新实现MainActivity,即使我模拟了对第三个片段的点击,因为它将返回初始状态,没有加载点。

感谢@Bruce和@ menion.asamm,感谢您抽出时间帮助我!

2 个答案:

答案 0 :(得分:2)

片段始终由一个活动拥有,因此您无法直接访问其他活动的片段。您正在进行的调用是在SecondActivity中查找片段。

你为什么要这样做?一旦某些UI处于屏幕外(MainActivity),您通常不想对这些UI对象执行任何操作,因为Android可能已将其从内存中删除。如果" my_fragment"中有数据? SecondActivity需要的方法,一种方法可能是将数据保存在SharedPreferences或my_fragment中的数据库中,然后将其加载到SecondActivity中。

EDIT 我不确定您是否认为运行哪项活动非常重要。以下是两种选择:

  1. 如果您只想运行已经在MainActivity中运行的片段的SAME实例,那么您可能想要做的就是完成SecondActivity以返回MainActivity。
  2. 如果您想在SecondActivity中创建同一片段的新副本,那么您可以将片段包含在SecondActivity的布局中(或稍后将其添加到某个容器中)。
  3. 另外,请注意,对于对findFragmentById的调用,ID需要是布局文件中指定的ID,作为android:id(而不是R.layout.my_fragment)的值。使用片段标记可能更好,您可以在布局文件中指定,也可以在添加片段时指定。

    主要是我认为你需要阅读Google的片段指南。

    EDIT2: 啊,我知道,我的应用程序中有类似的片段刷新情况。您基本上需要将SecondActivity中的数据返回到MainActivity中的片段。我使用的方法是:

    1. 将SecondActivity中的数据保存在存储(DB或SharedPreferences)中。
    2. 完成SecondActivity,以便再次显示MainActivity和您的片段。
    3. 覆盖片段中的onResume以获取您在SecondActivity中保存的数据。
    4. 另一个选择是使用startActivityForResult启动SecondActivity,然后在MainActivity中处理结果,将它们传递给它的片段。

      关于如何按标签查找片段,首先需要设置片段的标签。如果你在布局XML中声明你的片段,那么你可以在那里做(并且你也可以声明

      <fragment class="com.xyz.MyFragment"
          android:tag="MyFragment"
          android:id="@+id/my_fragment"
          android:layout_width="match_parent"
          android:layout_height="match_parent"
          />
      

      现在,从MainActivity内部,您可以findFragmentById(R.id.my_fragment)findFragmentByTag("MyFragment")

      如果您没有以XML格式声明片段,而是直接添加片段,则可以将片段标记设置为添加调用的一部分:

      FragmentTransaction ft = fm.beginTransaction();
      ft.add(R.id.frag_parent, new MyFragment(), tag);
      

      EDIT3:啊,你正在使用ViewPager来保存片段。现在我明白了。它们仍然是片段,但是访问它们确实很棘手,因为Android在某些内部代码中构造了片段标记。这是关于这个问题的另一个问题: Retrieve a Fragment from a ViewPager

答案 1 :(得分:1)

嗯,如果你真的需要刷新附加到不同活动的片段,我建议:

  • 第一项活动以

    开始第二项活动
    startActivityForResult(intent, MY_CODE);
    
  • 想要在第一个活动中刷新片段的第二个活动,用

    完成它的状态
    Intent data = new Intent();
    data.putExtra("REFRESH_FRAGMENT", true);
    setResult(RESULT_OK, data);
    finish();
    
  • 在第一个活动中,您可以通过

    捕获此结果
    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        // check request code
        if (requestCode == MY_CODE) {
            // check result
            if (resultCode == RESULT_OK) {
                // check data
                if (data != null && data.getBooleanExtra("REFRESH_FRAGMENT", false)) {
                    refreshFragment();
                }
            }
        }
    }
    

可能的?