我试图访问活动中的片段标记,通过触发一个方法(refreshData)来执行该特定片段中的某些逻辑。由于片段属于Tablayout,我完全可以完成坚持如何访问我的活动下的片段。 以下是代码段:
private void updateFragment(Intent intent){
FragmentManager manager = getSupportFragmentManager();
for (int i = 0; i < manager.getBackStackEntryCount(); i++) {
if (MyFragment.class.getName().equalsIgnoreCase(manager.getBackStackEntryAt(i).getName())) {
MyFragment currentFragment = (MyFragment)manager.findFragmentByTag(manager.getBackStackEntryAt(i).getName());
currentFragment.refreshData(intent);
break;
}
}
}
以下方式我在TabLayout
下创建了两个片段 @Override
public Fragment getItem(int position) {
switch (position) {
case 0:
MyFragment newsFragment = new MyFragment();
return newsFragment;
case 1:
return new MySecondFragment();
}
return null;
}
答案 0 :(得分:0)
您应该只为每个片段创建一个对象,例如
<!DOCTYPE html>
<html>
<head>
<style>
.floating-box {
display: inline-block;
width: 150px;
height: 75px;
margin: 10px;
border: 3px solid #73AD21;
}
.after-box {
clear: left;
border: 3px solid red;
}
.player
</style>
</head>
<script>
var has_been_played = 0;
function playSound() {
var aud=new Audio(file);
aud.play();
var b1 = document.getElementbyId("box" + num);
var b1.has_been_played == true;
}
var b1.has_been_played = pauseAud() {
document.getElementById("box" + num).setAttribute("onClick",
"javascript: pauseAud();");
}
function pauseAud() {
var aud=new Audio(file);
aud.pause();
}
</script>
<body>
<div id="box1" class="floating-box" onclick="playSound('donttalk.mp3');"></div>
<div id="box2" class="floating-box" onclick="playSound('goodvibrations.mp3');"></div>
</body>
</html>
然后根据适配器的位置,您可以访问这些片段的MyFragemnt newsFragment;
MySecondFragment secondFragemnt;
@Override
public Fragment getItem(int position) {
switch (position) {
case 0:
if(newsFragment == null)
newsFragment = new MyFragment();
return newsFragment;
case 1:
if(secondFragemnt== null)
secondFragemnt= new MySecondFragment();
return secondFragemnt;
}
return null;
}
。
refreshData()
希望这会有所帮助。
答案 1 :(得分:0)
我倾向于使用ArrayList
方法来存储Fragment
引用。这项工作的关键是instantiateItem(ViewGroup container, int position)
。这可能是PagerAdapter
中最重要的方法,因为它负责在配置更改时重新附加片段。如果它没有在内存中找到片段,它只会调用getItem(int position)
。通过实现此方法并将重新附加的片段放入ArrayList
,配置更改后,您将在列表中拥有相同的片段。
public class SomePagerAdapter extends FragmentPagerAdapter {
private ArrayList<Fragment> fragments = new ArrayList<>(4);
public SomePagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
switch (position){
case 0:
return FirstFragment.newInstance();
case 1:
return SecondFragment.newInstance();;
default:
return new Fragment();
}
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
Fragment fragment = (Fragment) super.instantiateItem(container, position);
fragments.add(fragment);
return fragment;
}
@Override
public int getCount() {
return 2;
}
public ArrayList<Fragment> getFragments() {
return fragments;
}
}
您可以使用上面的代码:
if(pagerAdapter.getFragments.get(whateverPosition) instanceof FirstFragment {
((FirstFragment)pagerAdapter.getFragments().get(whateverPosition)).refreshData(intent);
}
如果您始终确定要访问的内容,则不需要检查instanceof
,我只是希望确保我访问的内容符合我的预期。
另一个答案将一直有效,直到配置发生变化。之后你会发现自己引用了一个全新的片段,这可能与你预期的不同。
另请注意,由于系统使用Fragment
的构造方式,最佳做法是使用newInstance
静态方法实例化Fragment
。您可以通过newInstance()
传递任何您无法使用构造函数执行的操作。