我在Android中玩碎片。
我知道我可以通过使用以下代码更改一个片段:
FragmentManager fragMgr = getSupportFragmentManager();
FragmentTransaction fragTrans = fragMgr.beginTransaction();
MyFragment myFragment = new MyFragment(); //my custom fragment
fragTrans.replace(android.R.id.content, myFragment);
fragTrans.addToBackStack(null);
fragTrans.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
fragTrans.commit();
我的问题是,在Java文件中,如何获得当前显示的片段实例?
我遇到了一个类似的问题,我想知道当返回键被按下时最后显示的片段是什么。我用了一个非常简单的方法。每次我打开一个片段,在onCreate()方法中,我在我的单例中设置了一个变量(用你的片段的名称替换“myFragment”)
MySingleton.currentFragment = myFragment.class;
变量在单例中声明为
public static Class currentFragment = null;
然后在onBackPressed()中检查
if (MySingleton.currentFragment == myFragment.class){
// do something
return;
}
super.onBackPressed();
确保调用super.onBackPressed();在“返回”之后,否则应用程序将处理返回键,这在我的情况下导致应用程序终止。
这是最好的方法:
android.app.Fragment currentFragment=getFragmentManager().findFragmentById(R.id.main_container);
if(currentFragment!=null)
{
String[] currentFragmentName = currentFragment.toString().split("\\{");
if (currentFragmentName[0].toString().equalsIgnoreCase("HomeSubjectFragment"))
{
fragment = new HomeStagesFragment();
tx = getSupportFragmentManager().beginTransaction();
tx.replace(R.id.main_container, fragment);
tx.addToBackStack(null);
tx.commit();
}
else if(currentFragmentName[0].toString().equalsIgnoreCase("HomeStagesFragment"))
{
new AlertDialog.Builder(this)
.setMessage("Are you sure you want to exit?")
.setCancelable(false)
.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
finish();
}
})
.setNegativeButton("No", null)
.show();
}
}
不要忘记在header中定义这个:
private Fragment fragment;
FragmentTransaction tx;
如果你有嵌套片段,如viewpagers内部viewpagers等
你想要得到所有嵌套的片段。
感谢Matt Mombrea的好意,回答一个稍微调整的版本。
private List<Fragment> getVisibleFragments(List<Fragment> searchFragments, List<Fragment> visibleFragments) {
if (searchFragments != null && searchFragments.size() > 0) {
for (Fragment fragment : searchFragments) {
List<Fragment> nestedFragments = new ArrayList<>();
List<Fragment> childFMFragments = fragment.getChildFragmentManager().getFragments();
List<Fragment> fmFragments = fragment.getFragmentManager().getFragments();
fmFragments.retainAll(childFMFragments);
nestedFragments.addAll(childFMFragments);
nestedFragments.addAll(fmFragments);
getVisibleFragments(nestedFragments, visibleFragments);
if (fragment != null && fragment.isVisible()) {
visibleFragments.add(fragment);
}
}
}
return visibleFragments;
}
用法如下:
List<Fragment> allVisibleFragments = getVisibleFragments(searchFragments, visibleFragments);
例如:
List<Fragment> visibleFragments = new ArrayList<>();
List<Fragment> searchFragments = MainActivity.this.getSupportFragmentManager().getFragments();
Toast.makeText(this, ""+getVisibleFragments(searchFragments, visibleFragments), Toast.LENGTH_LONG).show();
在你的活动中,在创建之前初始化你的片段
MyFragment myFragment = new MyFragment(); // add this
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
........
然后调用该方法来查看您的片段
openFragment(this.myFragment);
这是方法
(R.id.frame_container)是xml文件中的片段容器id
(框架布局)
private void openFragment(final Fragment fragment) {
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.replace(R.id.frame_container, fragment);
transaction.commit();
}
那么在你的活动中,Override方法应该是这样的
public void onBackPressed() {
if (myFragment.isVisible()) {
myFragment.onBackPressed(this);
return;
}
super.onBackPressed();
}
然后在你的片段中放入这个方法
public void onBackPressed(Activity activity) {
Toast.makeText(activity, "Back Pressed inside Fragment", Toast.LENGTH_SHORT).show();
}