我在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文件中,如何获得当前显示的片段实例?
每次当你显示fragment时,你必须把它标签放入backstack:
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.setTransition(FragmentTransaction.TRANSIT_ENTER_MASK);
ft.add(R.id.primaryLayout, fragment, tag);
ft.addToBackStack(tag);
ft.commit();
然后当你需要获取当前片段时,你可以使用这个方法:
public BaseFragment getActiveFragment() {
if (getSupportFragmentManager().getBackStackEntryCount() == 0) {
return null;
}
String tag = getSupportFragmentManager().getBackStackEntryAt(getSupportFragmentManager().getBackStackEntryCount() - 1).getName();
return (BaseFragment) getSupportFragmentManager().findFragmentByTag(tag);
}
在滚动片段的情况下,当你使用ViewPager类的实例时,假设mVeiwPager,你可以调用mviewpage . getcurrentitem()来获取当前片段int数。
在MainLayout.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
android:orientation="vertical"
tools:context="unidesign.photo360.MainActivity">
<android.support.design.widget.AppBarLayout
android:id="@+id/appbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:fitsSystemWindows="false"
android:theme="@style/AppTheme.AppBarOverlay"
app:expanded="false">
<android.support.v7.widget.Toolbar
android:id="@+id/main_activity_toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
app:popupTheme="@style/AppTheme.PopupOverlay"
app:title="@string/app_name">
</android.support.v7.widget.Toolbar>
</android.support.design.widget.AppBarLayout>
<android.support.v4.view.ViewPager
android:id="@+id/view_pager"
android:layout_width="match_parent"
android:layout_height="wrap_content">
</android.support.v4.view.ViewPager>
</android.support.design.widget.CoordinatorLayout>
在MainActivity.kt
class MainActivity : AppCompatActivity() {
lateinit var mViewPager: ViewPager
lateinit var pageAdapter: PageAdapter
// ...
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
pageAdapter = PageAdapter(supportFragmentManager)
mViewPager = findViewById(R.id.view_pager)
// ...
}
override fun onResume() {
super.onResume()
var currentFragment = pageAdapter.getItem(mViewPager.currentItem)
// ...
}
你好,我知道这是一个非常老的问题,但我想分享我自己的解决方案。
为了获得用户浏览的片段列表,我创建了一个helper类:
public class MyHelperClass{
private static ArrayList<Fragment> listFragment = new ArrayList<>();
public static void addFragment(Fragment f){
if(!existFragment(f)) {
listFragment.add(f);
}
}
public static void removeFragment(){
if(listFragment.size()>0)
listFragment.remove(listFragment.size()-1);
}
public static Fragment getCurrentFragment(){
return listFragment.get(listFragment.size()-1);
}
public static int sizeFragments(){
return listFragment.size();
}
private static Boolean existFragment(Fragment f){
Boolean ret = false;
for(Fragment fragment : listFragment){
if (fragment.getClass() == f.getClass()){
ret = true;
}
}
return ret;
}
进入主活动,我重写onAttachFragment方法
@Override
public void onAttachFragment(Fragment f) {
super.onAttachFragment(f);
MyHelperClass.addFragment(f);
}
并且,我重写onBackPressed方法:
@Override
public void onBackPressed() {
General.removeFragment();
if(General.sizeFragments()>0){
Fragment fragment = null;
Class fragmentClass = General.getCurrentFragment().getClass();
try {
fragment = (Fragment) fragmentClass.newInstance();
fragment.setArguments(General.getCurrentFragment().getArguments());
} catch (Exception e) {
e.printStackTrace();
}
fragmentManager.beginTransaction().replace(R.id.flContent, fragment).commit();
}else{
super.onBackPressed();
}
}
所以通过这种方式,你可以在任何时候通过MyHelperClass.getCurrentFragment()获得活动片段
我希望这对任何人都有帮助
问候
每次当你显示fragment时,你必须把它标签放入backstack:
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.setTransition(FragmentTransaction.TRANSIT_ENTER_MASK);
ft.add(R.id.primaryLayout, fragment, tag);
ft.addToBackStack(tag);
ft.commit();
然后当你需要获取当前片段时,你可以使用这个方法:
public BaseFragment getActiveFragment() {
if (getSupportFragmentManager().getBackStackEntryCount() == 0) {
return null;
}
String tag = getSupportFragmentManager().getBackStackEntryAt(getSupportFragmentManager().getBackStackEntryCount() - 1).getName();
return (BaseFragment) getSupportFragmentManager().findFragmentByTag(tag);
}
Sev的答案适用于当你按下后退按钮或以其他方式更改后退堆栈时。
不过,我做了一些略有不同的事情。我有一个backstack更改监听器设置在一个基本片段和它的派生片段,这段代码是在监听器:
Fragment f = getActivity().getSupportFragmentManager().findFragmentById(R.id.container);
if (f.getClass().equals(getClass())) {
// On back button, or popBackStack(),
// the fragment that's becoming visible executes here,
// but not the one being popped, or others on the back stack
// So, for my case, I can change action bar bg color per fragment
}