我知道这个问题很多次。但我没有得到回报。我有一个包含两个选项卡的布局。当我切换标签时,它们每次都在重新加载。很多人建议使用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();
}
}
如何在切换时停止重新加载标签?
答案 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) {
...
}