Lee*_*fin 409 android android-intent android-layout android-fragments
我在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();
Run Code Online (Sandbox Code Playgroud)
我的问题是,在Java文件中,如何获取当前显示的Fragment实例?
ram*_*oid 434
在事务中添加片段时,应使用标记.
fragTrans.replace(android.R.id.content, myFragment, "MY_FRAGMENT");
Run Code Online (Sandbox Code Playgroud)
...以后如果要检查片段是否可见:
MyFragment myFragment = (MyFragment)getFragmentManager().findFragmentByTag("MY_FRAGMENT");
if (myFragment != null && myFragment.isVisible()) {
// add your code here
}
Run Code Online (Sandbox Code Playgroud)
另请参阅http://developer.android.com/reference/android/app/Fragment.html
小智 386
我知道这是一个老帖子,但之前也遇到了麻烦.找到了一个在onBackStackChanged()
听力功能中做到这一点的解决方案
@Override
public void onBackPressed() {
super.onBackPressed();
Fragment f = getActivity().getFragmentManager().findFragmentById(R.id.fragment_container);
if(f instanceof CustomFragmentClass)
// do something with f
((CustomFragmentClass) f).doSomething();
}
Run Code Online (Sandbox Code Playgroud)
这对我有用,因为我不想遍历每个片段,我必须找到一个可见的片段.希望它也可以帮助其他人.
Mat*_*rea 149
这是我的解决方案,我发现它适用于低碎片方案
public Fragment getVisibleFragment(){
FragmentManager fragmentManager = MainActivity.this.getSupportFragmentManager();
List<Fragment> fragments = fragmentManager.getFragments();
if(fragments != null){
for(Fragment fragment : fragments){
if(fragment != null && fragment.isVisible())
return fragment;
}
}
return null;
}
Run Code Online (Sandbox Code Playgroud)
小智 76
每次显示片段时,都必须将其标记为backstack:
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.setTransition(FragmentTransaction.TRANSIT_ENTER_MASK);
ft.add(R.id.primaryLayout, fragment, tag);
ft.addToBackStack(tag);
ft.commit();
Run Code Online (Sandbox Code Playgroud)
然后,当您需要获取当前片段时,您可以使用此方法:
public BaseFragment getActiveFragment() {
if (getSupportFragmentManager().getBackStackEntryCount() == 0) {
return null;
}
String tag = getSupportFragmentManager().getBackStackEntryAt(getSupportFragmentManager().getBackStackEntryCount() - 1).getName();
return (BaseFragment) getSupportFragmentManager().findFragmentByTag(tag);
}
Run Code Online (Sandbox Code Playgroud)
tai*_*iny 21
我用来查找当前显示片段的是以下代码.它很简单,现在对我有用.它运行在包含片段的活动中
FragmentManager fragManager = this.getSupportFragmentManager();
int count = this.getSupportFragmentManager().getBackStackEntryCount();
Fragment frag = fragManager.getFragments().get(count>0?count-1:count);
Run Code Online (Sandbox Code Playgroud)
loc*_*ost 14
该反应方式:
Observable.from(getSupportFragmentManager().getFragments())
.filter(fragment -> fragment.isVisible())
.subscribe(fragment1 -> {
// Do something with it
}, throwable1 -> {
//
});
Run Code Online (Sandbox Code Playgroud)
Tho*_*dax 11
我的方法基于try/catch,如下所示:
MyFragment viewer = null;
if(getFragmentManager().findFragmentByTag(MY_TAG_FRAGMENT) instanceOf MyFragment){
viewer = (MyFragment) getFragmentManager().findFragmentByTag(MY_TAG_FRAGMENT);
}
Run Code Online (Sandbox Code Playgroud)
但可能有更好的方法......
Caf*_*han 10
科特林方式;
val currentFragment = supportFragmentManager.fragments.last()
Run Code Online (Sandbox Code Playgroud)
Cor*_*Roy 10
如果您使用的是AndroidX Navigation
:
val currentFragment = findNavController(R.id.your_navhost)?.currentDestination
Run Code Online (Sandbox Code Playgroud)
有关此导航组件的更多信息:https : //developer.android.com/guide/navigation/navigation-getting-started
那么,这个问题得到了很多的意见和关注,但仍然没有包含在从我的目的最简单的方法 - 使用getFragments().
List fragments = getSupportFragmentManager().getFragments();
mCurrentFragment = fragments.get(fragments.size() - 1);
Run Code Online (Sandbox Code Playgroud)
这有点晚了,但对于任何感兴趣的人:如果您知道FragmentManager中所需片段的索引,只需获取对它的引用并检查isMenuVisible()函数!这里 :
getSupportFragmentManager().getFragments().get(0).isMenuVisible()
Run Code Online (Sandbox Code Playgroud)
如果true
它对用户可见等等!
小智 7
1)
ft.replace(R.id.content_frame, fragment, **tag**).commit();
Run Code Online (Sandbox Code Playgroud)
2)
FragmentManager fragmentManager = getSupportFragmentManager();
Fragment currentFragment = fragmentManager.findFragmentById(R.id.content_frame);
Run Code Online (Sandbox Code Playgroud)
3)
if (currentFragment.getTag().equals(**"Fragment_Main"**))
{
//Do something
}
else
if (currentFragment.getTag().equals(**"Fragment_DM"**))
{
//Do something
}
Run Code Online (Sandbox Code Playgroud)
您可以查询哪个片段加载到“活动”内容框架中,并获取片段类或片段“简单名称”(作为字符串)。
public String getCurrentFragment(){
return activity.getSupportFragmentManager().findFragmentById(R.id.content_frame).getClass().getSimpleName();
}
Run Code Online (Sandbox Code Playgroud)
用法:
Log.d(TAG, getCurrentFragment());
Run Code Online (Sandbox Code Playgroud)
输出:
D/MainActivity: FragOne
Run Code Online (Sandbox Code Playgroud)
以上 30 个答案都不适合我。但这是有效的答案:
使用 Kotlin,使用导航组件时:
fun currentVisibleFragment(): Fragment? {
return supportFragmentManager.fragments.first()?.getChildFragmentManager()?.getFragments()?.get(0)
}
Run Code Online (Sandbox Code Playgroud)
这应该有效 -
val visibleFragment = supportFragmentManager.fragments.findLast { fgm -> fgm.isVisible }
Timber.d("backStackIterator: visibleFragment: $visibleFragment")
Run Code Online (Sandbox Code Playgroud)
受到泰尼回答的启发,这是我的两分钱.从大多数其他实现中修改很少.
private Fragment getCurrentFragment() {
FragmentManager fragmentManager = myActivity.getSupportFragmentManager();
int stackCount = fragmentManager.getBackStackEntryCount();
if( fragmentManager.getFragments() != null ) return fragmentManager.getFragments().get( stackCount > 0 ? stackCount-1 : stackCount );
else return null;
}
Run Code Online (Sandbox Code Playgroud)
"myActivity"
如果是您当前的活动或使用对您的活动的引用,请替换为"this".
有一个叫方法findFragmentById()
在SupportFragmentManager
.我在活动容器中使用它,如:
public Fragment currentFragment(){
return getSupportFragmentManager().findFragmentById(R.id.activity_newsfeed_frame);
}
Run Code Online (Sandbox Code Playgroud)
这就是如何获得你的当前Fragment
.如果您有自定义Fragment
并需要检查Fragment
它是什么,我通常使用instanceof
:
if (currentFragment() instanceof MyFrag){
// Do something here
}
Run Code Online (Sandbox Code Playgroud)
小智 5
这是获取当前片段的简单方法..
getFragmentManager().addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() {
@Override public void onBackStackChanged() {
currentFragment = fragmentManager.findFragmentById(R.id.content);
if (currentFragment != null && (currentFragment instanceof LoginScreenFragment)) {
logout.setVisibility(View.GONE);
} else {
logout.setVisibility(View.VISIBLE);
}
}
});
Run Code Online (Sandbox Code Playgroud)
查看此解决方案。获取当前 Fragment 对我有用。
if(getSupportFragmentManager().getBackStackEntryCount() > 0){
android.support.v4.app.Fragment f =
getSupportFragmentManager().findFragmentById(R.id.fragment_container);
if(f instanceof ProfileFragment){
Log.d(TAG, "Profile Fragment");
}else if(f instanceof SavedLocationsFragment){
Log.d(TAG, "SavedLocations Fragment");
}else if(f instanceof AddLocationFragment){
Log.d(TAG, "Add Locations Fragment");
}
Run Code Online (Sandbox Code Playgroud)
如果到达这里并且您正在使用Kotlin:
var fragment = supportFragmentManager.findFragmentById(R.id.fragment_container)
Run Code Online (Sandbox Code Playgroud)
R.id.fragment_container
是id
在fragment
是展示自己的activity
或者,如果您需要更好的解决方案:
supportFragmentManager.findFragmentById(R.id.content_main)?.let {
// the fragment exists
if (it is FooFragment) {
// The presented fragment is FooFragment type
}
}
Run Code Online (Sandbox Code Playgroud)
就这么简单,不需要编写那么多代码
yourFragment.isAdded()
或
yourFragment.isVisible()
;
我更喜欢 isAdded(),它们都返回布尔值在 if 条件中使用它,并且必须在 onCreate() 中初始化您的片段,否则您将获得空点异常。
归档时间: |
|
查看次数: |
397840 次 |
最近记录: |