如何停止重新加载片段

时间:2014-10-04 09:58:40

标签: android android-fragments

我知道这个问题很多次。但我没有得到回报。我有一个包含两个选项卡的布局。当我切换标签时,它们每次都在重新加载。很多人建议使用viewpager。但我对viewPager一无所知。我的项目差不多完成了。

我的布局代码:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_devices);

    mPreferences = getSharedPreferences(PreferencesManager.SCOPE,
            MODE_PRIVATE);

    mBundle = getIntent().getExtras();

    try {
        rl = (RelativeLayout) findViewById(R.id.mainLayout);
        //((Object) rl).setOffscreenPageLimit(2);
        fragMentTra = getFragmentManager().beginTransaction();
        ActionBar bar = getActionBar();
        bar.addTab(bar.newTab().setText(TAB_NAME1).setTabListener(this));
        bar.addTab(bar.newTab().setText(TAB_NAME2).setTabListener(this));

        bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
        bar.show();

    } catch (Exception e) {
        e.getMessage();
    }

}

FragmentMine fram1;
FragmentTransaction fragMentTra = null;
FragmentAll fram2;


@Override
public void onTabSelected(Tab tab, FragmentTransaction ft) {

    if (tab.getText().equals(TAB_NAME1)) {
        try {
            rl.removeAllViews();
        } catch (Exception e) {
        }
        fram1 = new FragmentMine();
        fragMentTra.addToBackStack(null);
        fragMentTra = getFragmentManager().beginTransaction();
        fragMentTra.add(rl.getId(), fram1);
        fragMentTra.commit();
    } else if (tab.getText().equals(TAB_NAME2)) {
        try {
            rl.removeAllViews();
        } catch (Exception e) {
        }
        fram2 = new FragmentAll();
        fragMentTra.addToBackStack(null);
        fragMentTra = getFragmentManager().beginTransaction();
        fragMentTra.add(rl.getId(), fram2);
        fragMentTra.commit();
    }
}

如何在切换时停止重新加载标签?

3 个答案:

答案 0 :(得分:1)

每次调用onTabSelected()时,都会实例化一个新片段。 你应该使用FragmentPagerAdapter。

检查:http://developer.android.com/reference/android/support/v4/app/FragmentPagerAdapter.html

答案 1 :(得分:1)

正如Rik所指出的那样,您通过以下方式实例化新的Fragment

fram1 = new FragmentMine();  

您需要通过覆盖onSaveInstanceState()来保存片段的状态:

@Override 
public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    // Whatever is there to save
} 

答案 2 :(得分:0)

使用这个类只帮助你处理 onViewCreated 一次

abstract class BaseFragment<B : ViewDataBinding>(
    private val viewID: Int,
) : Fragment() {

    var dataBinding: B? = null
    private var isPageLoaded = false

    abstract fun onViewCreated()

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        if (!isPageLoaded) {
            onViewCreated()
            isPageLoaded = true
        }
    }

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?,
    ): View? {
        if (dataBinding == null) {
            performDataBinding(inflater, container)
        }
        return dataBinding?.root
    }

    private fun performDataBinding(
        inflater: LayoutInflater,
        container: ViewGroup?,
    ) {
        dataBinding = DataBindingUtil.inflate(
            inflater, viewID, container, false
        )
        dataBinding?.let {
            it.lifecycleOwner = this
        }
    }
}

并像这样在您的片段中使用此类:

class HomeFragment : BaseFragment<FragmentHomeBinding>(R.layout.fragment_home) {
...
}
相关问题