gpt4 book ai didi

android - 替换 fragment 的有效方法

转载 作者:行者123 更新时间:2023-11-30 02:46:41 24 4
gpt4 key购买 nike

我创建了一个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() 函数。它可以通过两种不同的方式完成同样的工作

  1. 通过隐藏所有 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();
    }
  2. 分离所有 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 ,但其stateFragmentManager 维护。这意味着您可以通过调用 attach 方法,使用修改后的 ViewHierarchy

重用此 fragment

最佳答案

为什么不直接使用 ViewPager?这两种方法几乎相同,没有显着差异。你希望有一个吗?您持有对一个数组中所有 fragment 的引用。您没有像 FragmentStatePagerAdapterViewPager 那样有效地回收 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com