我已经查看了Stackoverflow上的所有问题,但无法找到这个问题的唯一确定答案.如何将标记设置为aFragment
以便通过它检索getFragmentManager().findFragmentByTag()
?有人可以给出一个如何创建标签的简单代码示例Fragment
吗?
根据谷歌的文档:
您现在可以将片段嵌入片段中.这对于您希望将动态和可重用UI组件放入自身动态且可重用的UI组件的各种情况都很有用.例如,如果使用ViewPager创建向左和向右滑动并占用大部分屏幕空间的片段,则现在可以将片段插入到每个片段页面中.要嵌套片段,只需在要添加片段的片段上调用getChildFragmentManager().这将返回一个FragmentManager,您可以像通常从顶级活动那样使用它来创建片段事务.例如,这里有一些代码可以在现有的Fragment类中添加一个片段:
Fragment videoFragment = new VideoPlayerFragment();
FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
transaction.add(R.id.video_fragment, videoFragment).commit();
Run Code Online (Sandbox Code Playgroud)
所以我(例如)TestFragment
看起来像:
public class TestFragment extends Fragment {
private View mFragmentView;
private FrameLayout mFrameLayout;
public HistoryFragment() {
super();
}
@Override
public View onCreateView(LayoutInflater pInflater, ViewGroup pViewGroup, Bundle pBundle) {
mFragmentView = pInflater.inflate(R.layout.fragment_layout, pViewGroup, false);
mFrameLayout = (FrameLayout) mFragmentView.findViewById(R.id.framelayout);
return mFragmentView;
}
public void onDestroyView() {
super.onDestroyView();
}
/* ISSUE */
public void doSomethingSpecial() {
FragmentManager tFragmentManager = getChildFragmentManager();
}
}
Run Code Online (Sandbox Code Playgroud)
在MainActivity
我初始化我的片段像:
mTestFragment = …
Run Code Online (Sandbox Code Playgroud) android android-fragments android-viewpager fragmentmanager android-nested-fragment
我有3个片段A,B,CI写了一段代码来替换它们并维护backstack:
public void addFragment(Fragment fragmentToAdd, String fragmentTag) {
FragmentManager supportFragmentManager = getSupportFragmentManager();
Fragment activeFragment = getActiveFragment();
FragmentTransaction fragmentTransaction = supportFragmentManager
.beginTransaction();
if (null != activeFragment) {
fragmentTransaction.hide(activeFragment);
}
fragmentTransaction.replace(R.id.layout_child_activity, fragmentToAdd,
fragmentTag);
if (supportFragmentManager.getBackStackEntryCount() > 1) {
supportFragmentManager.popBackStack();
}
fragmentTransaction.addToBackStack(fragmentTag);
fragmentTransaction.commit();
}
Run Code Online (Sandbox Code Playgroud)
在这段代码中
if (supportFragmentManager.getBackStackEntryCount() > 1) {
supportFragmentManager.popBackStack();
}
Run Code Online (Sandbox Code Playgroud)
如果堆栈长度大于1,我使用pop来获取最新的片段.现在由于这个,当长度大于1时,它会一次又一次地调用onCreate视图.喜欢 :
为什么我会遇到这种行为?当我删除斜体代码时,它没有发生.
android fragment android-fragments back-stack fragmentmanager
如果用户没有数据,我会显示一个空片段.在那个emptyFragment(in onViewCreated
)中,我检查一个条件,有时想用另一个替换那个空的Fragment,所以我在相应的活动上调用一个替换片段的方法.
一些用户(目前只有三星,6.0.1,但我不知道这是否意味着什么)在我所遇到的线路上遇到了崩溃executePendingTransactions
:
IllegalStateException:
Fatal Exception: java.lang.RuntimeException
Unable to resume activity
{....app.activities.MyActivity_}:
java.lang.IllegalStateException: FragmentManager is already executing transactions
Run Code Online (Sandbox Code Playgroud)
这是6.0.1中onViewCreated
的错误还是错误的地方?
编辑
这是一个可能的解决方案吗?
if (addToBackStack) {
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, contentFragment, name).addToBackStack(name).commitAllowingStateLoss();
getSupportFragmentManager().executePendingTransactions();
} else {
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, contentFragment, name).commitNow();
}
Run Code Online (Sandbox Code Playgroud) android illegalstateexception android-fragments fragmentmanager
我有一个带有底部导航标签的活动,正在更改其中的片段.当我在这些标签上来回点击时,它会在某些时候停止工作.代码执行得很好,因为我把一些日志放入其中.但片段没有被切换.
代码在kotlin中,但它相当直接
fun showTabFragment(tag: String) {
val currentFragment: Fragment? = supportFragmentManager.fragments?.lastOrNull()
var fragment = supportFragmentManager.findFragmentByTag(tag)
val fragmentExists = fragment != null
if (fragment == null) {
when (tag) {
TAG_LOGBOOK -> fragment = LogbookFragment()
TAG_RECIPES -> fragment = RecipesFragment()
TAG_PROFILE -> fragment = ProfileFragment()
else -> fragment = MeetingPlacesFragment()
}
}
val transaction = supportFragmentManager.beginTransaction()
if (currentFragment != null) {
Log.i("jacek", "hiding " + currentFragment.javaClass.simpleName)
transaction.hide(currentFragment)
}
if (fragmentExists) {
Log.i("jacek", "showing " + fragment.javaClass.simpleName)
transaction.show(fragment)
} else {
Log.i("jacek", …
Run Code Online (Sandbox Code Playgroud) 所以,我注意到有趣的问题.当我以编程方式添加新片段时,OnBackStackChangedListener中的onBackStackChanged方法被调用两次,但它必须只调用一次.这是我的活动代码:
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity implements FragmentManager.OnBackStackChangedListener{
private FragmentManager fragmentManager;
private Button button1;
private Button button2;
private Button button3;
private Fragment defaultFragment;
private Fragment previousFragment;
private Fragment currentFragment;
private String currentFragmentTag;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button1 = (Button) findViewById(R.id.button);
button2 = (Button) findViewById(R.id.button2);
button3 = (Button) findViewById(R.id.button3);
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
showFragment(new FragmentOne(), FragmentOne.TAG);
}
}); …
Run Code Online (Sandbox Code Playgroud) 问题:当我按下按钮时,我看到C的几分之一秒,然后显示G.To防止这种情况我试图在答案的帮助下停止动画,但即使动画停止,C仍然可见几分之一秒片段.
在更换C顶部的片段时,有没有更好的方法来设计片段流或解决这些电影的方法?
android android-fragments fragmentmanager fragment-backstack
由于API 27 FragmentPagerAdapter
已弃用。最好的替代方法是什么?
就我而言,我知道super(fragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT)
需要使用类似的东西,但是我不知道代码需要放在哪里。
我在课堂上得到了这些进口:
import androidx.fragment.app.FragmentManager
import androidx.fragment.app.FragmentPagerAdapter
Run Code Online (Sandbox Code Playgroud)
但FragmentPagerAdapter
在class MyViewPagerAdapter(manager: FragmentManager) : FragmentPagerAdapter(manager){
被划掉。
class MyViewPagerAdapter(manager: FragmentManager) : FragmentPagerAdapter(manager){
private val fragmentList : MutableList<androidx.fragment.app.Fragment> = ArrayList()
private val titleList : MutableList<String> = ArrayList()
override fun getItem(position: Int): androidx.fragment.app.Fragment {
return fragmentList[position]
}
override fun getCount(): Int {
return fragmentList.size
}
fun addFragment(fragment: androidx.fragment.app.Fragment, title: String){
fragmentList.add(fragment)
titleList.add(title)
}
override fun getPageTitle(position: Int): CharSequence? {
return titleList[position]
}
}
Run Code Online (Sandbox Code Playgroud) android android-viewpager kotlin fragmentpageradapter fragmentmanager
获得弃用警告androidx.fragment.app.Fragment
:
警告:[deprecation]
getFragmentManager()
inFragment
已被弃用。
该怎么办?
android android-fragments fragmentmanager deprecation-warning androidx
我正在将 Android 的导航架构组件集成到我的应用程序中。我在将数据从活动传递到片段的开头时遇到了一些问题,所以我遵循了这个答案:导航架构组件-将参数数据传递到 startDestination。
这个逻辑对我来说似乎很合理,但我正在努力确定如何实际获得 NavHostFragment。Elliot Shrock 使用了这条线——
val navHostFragment = navFragment as NavHostFragment
但我还没有找到一个有效的 Java 等价物。我尝试通过使用获取我的 navHost 的片段
getSupportFragmentManager().findFragmentById(R.id.[mynavhostid])
但此命令返回空值。有任何想法吗?
android android-fragments fragmentmanager android-architecture-components android-architecture-navigation
android ×10
fragmentmanager ×10
kotlin ×2
android-architecture-components ×1
android-architecture-navigation ×1
android-view ×1
androidx ×1
back-stack ×1
fragment ×1
java ×1