- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我创建了一个MainActivity 类似TabActivity(只喜欢),并向其中添加了四个Fragments
。一次只能显示一个。因此,当单击任何一个 tab(image
) 时,我会隐藏所有其他 fragment 并显示与该选项卡关联的 fragment 。我成功地实现了它。我找到了两种解决方案来完成相同的工作,但我想知道哪个有效,我更喜欢哪个
MainActivity.class
public class MainActivity extends Activity //implements FragmentDelegate, FragmentManager.OnBackStackChangedListener
{
private final String TAG = "Main";
public LinearLayout tab1,tab2,tab3,tab4;
public ImageView img1,img2,img3,img4;
Fragment[] frag = new Fragment[4];
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.practicing);
init();
}
@SuppressLint("NewApi")
private void showFragment(int x)
{
for(int j = 0; j < 4; j++)
{
//getFragmentManager().beginTransaction().hide(frag[j]).commit();
if(j !=x )
{
getFragmentManager().beginTransaction().detach(frag[j]).commit();
}
}
//getFragmentManager().beginTransaction().show(frag[x]).commit();
getFragmentManager().beginTransaction().attach(frag[x]).commit();
}
private void init()
{
tab1 = (LinearLayout) findViewById(R.id.tab1);
tab2 = (LinearLayout) findViewById(R.id.tab2);
tab3 = (LinearLayout) findViewById(R.id.tab3);
tab4 = (LinearLayout) findViewById(R.id.tab4);
img1 = (ImageView)findViewById(R.id.tab_img1);
img2 = (ImageView)findViewById(R.id.tab_img2);
img3 = (ImageView)findViewById(R.id.tab_img3);
img4 = (ImageView)findViewById(R.id.tab_img4);
frag[0] = new Article();
frag[1] = new Forum();
frag[2] = new Medias();
frag[3] = new Profile();
for(int i = 0; i < 4; i++)
{
getFragmentManager().beginTransaction().add(R.id.container, frag[i])
//.addToBackStack(null)
.commit();
}
showFragment(0);
}
public void selectFrag(View view)
{
if (view == findViewById(R.id.tab1))
{
img1.setBackgroundResource(R.drawable.articles_on);
img2.setBackgroundResource(R.drawable.forum_off);
img3.setBackgroundResource(R.drawable.video_off);
img4.setBackgroundResource(R.drawable.profile_off);
showFragment(0);
}
else if(view == findViewById(R.id.tab2))
{
img1.setBackgroundResource(R.drawable.articles_off);
img2.setBackgroundResource(R.drawable.forum_on);
img3.setBackgroundResource(R.drawable.video_off);
img4.setBackgroundResource(R.drawable.profile_off);
showFragment(1);
}
else if(view == findViewById(R.id.tab3))
{
img1.setBackgroundResource(R.drawable.articles_off);
img2.setBackgroundResource(R.drawable.forum_off);
img3.setBackgroundResource(R.drawable.video_on);
img4.setBackgroundResource(R.drawable.profile_off);
}
else if(view == findViewById(R.id.tab4))
{
img1.setBackgroundResource(R.drawable.articles_off);
img2.setBackgroundResource(R.drawable.forum_off);
img3.setBackgroundResource(R.drawable.video_off);
img4.setBackgroundResource(R.drawable.profile_on);
showFragment(3);
}
}
}
请参阅 MainActivity 中的 showFragment()
函数。它可以通过两种不同的方式完成同样的工作
通过隐藏所有 fragment 并显示您想要显示的 fragment 。
private void showFragment(int x)
{
for(int j = 0; j < 4; j++)
{
getFragmentManager().beginTransaction().hide(frag[j]).commit();
}
getFragmentManager().beginTransaction().show(frag[x]).commit();
}
分离所有 Activity 并附加您要显示的 fragment 。在此方法中,我必须添加 SuppressLint("NewApi")
。..
@SuppressLint("NewApi")
private void showFragment(int x)
{
for(int j = 0; j < 4; j++)
{
if(j != x)
{
getFragmentManager().beginTransaction().detach(frag[j]).commit();
}
}
getFragmentManager().beginTransaction().attach(frag[x]).commit();
}
根据我的想法,第二种方法是有效的,但我想知道你对此的看法。
这是我的推测/理解(可能有误)
当我们隐藏所有 fragment 但显示我们想要的 fragment 时。这些 fragment 隐藏但占用空间/内存。而当我们附加它时,它将使用最后一个状态保存重新创建,并且在重新创建之前不占用空间。
detach
方法从 UI 中删除 fragment ,但其state
由 FragmentManager
维护。这意味着您可以通过调用 attach
方法,使用修改后的 ViewHierarchy
fragment
最佳答案
为什么不直接使用 ViewPager
?这两种方法几乎相同,没有显着差异。你希望有一个吗?您持有对一个数组中所有 fragment 的引用。您没有像 FragmentStatePagerAdapter
对 ViewPager
那样有效地回收 Fragments
,您只是不断地持有对所有 fragment 的引用。您如何隐藏和显示 Fragments 没有任何区别,所有 Fragments
都在内存中。
而且您不需要为每个 Fragment
执行 FragmentTransaction
。如果你真的想提高性能,而不是像这样在一个 FragmentTransaction
中替换所有 Fragments
:
FragmentManager manager = getFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
for(int j=0; j < 4; j++) {
transaction.hide(...);
}
transaction.show(...);
transaction.commit();
您在这里执行了 5 个 FragmentTransactions
:
for(int j=0;j<4;j++) {
if(j !=x)
{
getFragmentManager().beginTransaction().detach(frag[j]).commit();
}
}
getFragmentManager().beginTransaction().attach(frag[x]).commit();
与 detach()
/attach()
和 hide( )
/显示()
。
但是为了记录:使用 detach()
和 attach()
而不是 hide()
和 show()
在内存方面会稍微好一些,因为这两种方法允许销毁未使用的 Fragments
的 View 层次结构。
关于android - 替换 fragment 的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24884792/
我有一个像这样的 fragment 栈 F1 -> F2 -> F3 -> F4 -> F5 现在我需要删除 F2、F3、F4 fragment 。 我需要如果我从 F5 fragment 按下后退按
我需要帮助来理解以下场景的工作原理以及如何实现结果。 我有一个名为 ShoppingCart 的类。它有一个名为 addItemsToShoppingCartFromPreviousOrder 的方法
我有一个包含 ViewPager 的 fragment 。这个 ViewPager 显然是由其他 Fragments 填充的。 我的问题是,ViewPager 中的 Fragment 是否有任何方法(
所以我正在实现一个 FragmentActivity 并尝试添加一个 fragment ,但是我遇到了多个问题。我以前做过这个,实际上我使用的代码与上一个项目(它工作的地方)相同,但由于某种原因它在这
Closed. This question needs details or clarity。它当前不接受答案。
我想将 Android X fragment (androidx.fragment.app.Fragment) 转换为 Android native fragment (android.app.Fra
假设我有一个包含 10 列文本类型 (20) 的 SQLite 表。 ListFragment 将从数据库中提取 4 列并使用 SimpleCursorAdapter 显示在列表中。 选择后,List
我有一个对话框 fragment ,我为延迟初始化创建了一个类。当我显示对话框时,它显示正常。但是,当我关闭对话框时,它崩溃的原因是: fragment 与 fragment 管理器无关。 我也尝试过
我想在 View 分页器更改为 fragment 时刷新该 fragment 。 package com.mcivisoft.rcbeam; import android.os.Bundle; imp
我有一个名为的 Activity MainActivity 我在容器 R.id.mainContainer 中添加了 fragment “BenefitFragment”。 在 BenefitFrag
所以我有这个 ClientListView,效果很好,可以显示客户,我可以单击一个客户并在右侧获取他们的详细信息(在我的第二个 fragment 中)。由此处的布局定义: 这很好用,但后来我
我试过这段代码,但点击第一个 fragment 中的按钮并没有改变第二个 fragment 中的字符串值。 这是第一个 fragment 的 kotlin 文件。它有两个按钮,点击它们可以更改字符串值
我有以下情况:我打开 fragment A 和目标,通过按钮的单击事件转到 fragment B。当我在 fragment B 中并点击后退按钮(为了返回 fragment A) 我想将一些参数传递给
我制作了一个 NavigationDrawer fragment ,其中包含 Home、Settings、Feedback 等项目。 home 项在点击 home 时应该打开,home 是在应用程序启
我正在一个接一个地替换 2 个 fragment ,两个 fragment 都有不同的选项菜单。当我替换第二个 fragment 时,它也显示第一个 fragment 的菜单。 setHasOptio
我有问题: android.app.Fragment$InstantiationException: Unable to instantiate fragment ${packageName}.${a
我正在研究 fragment 转换。当我用第二个 fragment 替换第一个 fragment 时,它出现在第一个 fragment 的下方。我希望它移动到第一个 fragment 之上。我该怎么做
我在抽屉导航里总共有 12 个 fragment 。每个 fragment 都有 volley 方法。每个 fragment 都显示自己的 Volley 响应,除了 position = 1 和 po
我在我的 Activity 中使用了两个 fragment 。最初我将向 Activity 添加一个 fragment 。然后在第一个 fragment 中使用监听器我想用第二个 fragment 替
我正在实现一个“fragments-101”程序,当相应的按钮被点击时我会替换一个 fragment 。然而,下面的事情发生了: 为什么会这样?为什么初始 fragment 没有被完全替换?MainA
我是一名优秀的程序员,十分优秀!