【问题标题】:Prevent re-added a fragment once it's loaded加载后防止重新添加片段
【发布时间】:2015-12-05 20:50:28
【问题描述】:

所以这是我在下图中的navigationDrawer 有菜单项,每个项目都添加一个片段并加载它自己的数据,所以如何防止在加载后重新添加片段,它是重新添加片段和我不想要那个。

这是我尝试过的:

 @Override
public boolean onNavigationItemSelected(MenuItem menuItem) {

    menuItem.setChecked(true);
    if (menuItem.getItemId() == R.id.nav_home) {

        makeTransaction(new Home(), "home_fragment");
        toolbarTitle.setText("Home");

    } else if (menuItem.getItemId() == R.id.nav_prizes) {

        makeTransaction(new Prizes(), "prizes_fragment");
        toolbarTitle.setText("Prizes");

    } else if (menuItem.getItemId() == R.id.nav_myAccount) {

        mDrawerLayout.closeDrawer(GravityCompat.START);
        startActivity(new Intent(MainActivity.this, MyAccount.class));

    } else if (menuItem.getItemId() == R.id.nav_contact_us) {

        makeTransaction(new ContactUs(), "contactUs_fragment");
        toolbarTitle.setText("Contact Us");

    } else if (menuItem.getItemId() == R.id.nav_about_us) {

        makeTransaction(new AboutUs(), "aboutUs_fragment");
        toolbarTitle.setText("About Us");

    } else if (menuItem.getItemId() == R.id.nav_share) {
        mDrawerLayout.closeDrawer(GravityCompat.START);
    } 
    return false;
}                              

public void makeTransaction(Fragment fragment, String tag) {
    FragmentTransaction transaction = getFragmentManager().beginTransaction();

    Fragment test = getFragmentManager().findFragmentByTag(tag);
    getFragmentManager().executePendingTransactions();

    if (test != null && test.isVisible()) {
        mDrawerLayout.closeDrawer(GravityCompat.START);
    } else if (test != null && test.isAdded()) {
        getFragmentManager().popBackStack(tag,0);

    } else {          
        mDrawerLayout.closeDrawer(GravityCompat.START);
        transaction.setCustomAnimations(R.anim.enter_from_left,
                R.anim.exit_to_right, 0, 0);                      
        transaction.add(R.id.fragment_container, fragment, tag);
        transaction.addToBackStack(tag);          
        transaction.commit();
    }                               
}           

【问题讨论】:

    标签: android android-fragments transactions fragment android-fragmentactivity


    【解决方案1】:

    我遇到类似的问题,一次又一次点击同一个项目,每次都重新加载相同的片段

    为此你可以制作方法

    public boolean checkFragment(int position, Fragment mFragment) {
            if ((mFragment instanceof "your_fragment_name"))
                return true;
    
    
            return false;
        }
    

    在提交片段之前

    你可以添加这个

    if (checkFragment(position, mFragment)) return;
    

    作为

    if (checkFragment(position, mFragment)) return;
            transaction.setCustomAnimations(R.anim.enter_from_left,
                    R.anim.exit_to_right, 0, 0);
            transaction.replace(R.id.fragment_container, fragment, tag);
            transaction.addToBackStack(tag);            
            transaction.commit();
    

    编辑

    请用以下代码替换您的 makeTransaction 方法。

    public void makeTransaction(Fragment fragment, String tag) {
        FragmentTransaction transaction = getFragmentManager().beginTransaction();
    
        Fragment test = getFragmentManager().findFragmentByTag(tag);
        if (test != null && test.isVisible()) {
            mDrawerLayout.closeDrawer(GravityCompat.START);
        } else if (test != null) {
            getFragmentManager().popBackStack(tag,      FragmentManager.POP_BACK_STACK_INCLUSIVE);
            // getSupportFragmentManager().popBackStackImmediate(tag, 0);
        } else {          
            mDrawerLayout.closeDrawer(GravityCompat.START);
    
    
    if (checkFragment(position, mFragment)) return;
         transaction.setCustomAnimations(R.anim.enter_from_left,
                    R.anim.exit_to_right, 0, 0);
            transaction.replace(R.id.fragment_container, fragment, tag);
            transaction.addToBackStack(tag);          
            transaction.commit();
        }             
    }       
    

    如果 source 是一个对象变量,那么 instanceof 是一种检查它是否是 Fragment 的方法。

    所以我们使用这个属性来检查当前点击的项目是否是其片段的实例。

    【讨论】:

    • 更多解释请:(!
    • 老实说,我不认为我在寻找什么,我只需要检查“home_fragment”是否已添加到活动中,当我添加另一个片段时,“home_fragment”应该暂停并新建片段会出现,所以一旦用户再次点击“home_fragment”,它应该打开片段而不重新加载它的所有视图,因为它已经添加了..明白了吗?
    【解决方案2】:

    在方法之外为 FragmentManager 声明变量:

    FragmentManager fm;
    

    在 onCreate() 的某个地方,你初始化它。

    fm = getFragmentManager();
    

    在你的 makeTransaction() 中使用 fm 而不是“getFragmentManager()”

     FragmentTransaction transaction = fm.beginTransaction();
    

    等等。

    这让您的管理更轻松,您可以像这样使用 TAG 找到片段:

     Fragment fragment = ({FRAGMENT_CLASS}) fm.findFragmentByTag({TAG});
    
        if (fragment == null) {
            //add to transaction
        } else {
            //use existing thorugh fragment
        }
    

    如果之后fragment 不为空,它将具有指向使用该标签创建的片段的链接。

    如果您创建以下片段:

      makeTransaction(new ContactUs(), "contactUs_fragment");
    

    您可以像这样获得对它的引用:

    Fragment fragment = (ContactUs) fm.findFragmentByTag("contactUs_fragment");
    

    随心所欲。

    【讨论】:

    • 你能给我更多的解释吗?否则会发生什么?
    • @AhmadAlkhateeb,这段代码在所有创建的fragment中寻找定义了TAG的fragment并返回对它的引用,这样你就可以使用现有的fragment而不用创建新的了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-03
    • 1970-01-01
    相关资源
    最近更新 更多