我发现了很多关于此的问题,但这些都不能帮助我。
我有一个" 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,感谢您抽出时间帮助我!
答案 0 :(得分:2)
片段始终由一个活动拥有,因此您无法直接访问其他活动的片段。您正在进行的调用是在SecondActivity中查找片段。
你为什么要这样做?一旦某些UI处于屏幕外(MainActivity),您通常不想对这些UI对象执行任何操作,因为Android可能已将其从内存中删除。如果" my_fragment"中有数据? SecondActivity需要的方法,一种方法可能是将数据保存在SharedPreferences或my_fragment中的数据库中,然后将其加载到SecondActivity中。
EDIT 我不确定您是否认为运行哪项活动非常重要。以下是两种选择:
另外,请注意,对于对findFragmentById的调用,ID需要是布局文件中指定的ID,作为android:id(而不是R.layout.my_fragment)的值。使用片段标记可能更好,您可以在布局文件中指定,也可以在添加片段时指定。
主要是我认为你需要阅读Google的片段指南。
EDIT2: 啊,我知道,我的应用程序中有类似的片段刷新情况。您基本上需要将SecondActivity中的数据返回到MainActivity中的片段。我使用的方法是:
另一个选择是使用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();
}
}
}
}
可能的?