首先,我知道这些主题已经在 stackoverflow 上创建了很多时间,但我还没有找到解决问题的方法。其次,我是法国人,所以我的英语不是很完美,如果你不明白的话,请提前向我道歉。为了结束这个介绍,我是第一次处理碎片,所以,如果有什么我不太了解的地方,请见谅!
我有三个按钮,允许在三个片段之间切换。在其中一个片段中,我有一个带有两个片段的视图寻呼机。目前,每个片段(有 5 个)仅包含一个 TextView。我正在使用最新版本的android-support-v4(我在stackoverflow中阅读了很多主题,说最新版本的支持解决了我遇到的“recursive entry to executePendingTransactions”错误)。
我的两个问题:
当我在一个按钮上单击两次时,我有一个 IllegaleStateException “无法更改片段标签”。我可以通过在 onButtonSelected 方法上创建一个新片段来解决这个问题,但是出于内存原因和功能原因,我不想每次都重新创建片段:片段必须保持她的状态。这个问题不是我的主要问题,确实,我知道当用户已经在片段上时禁用按钮是可能的,但是当这个管理没有完成时出现异常是很奇怪的,不是吗?
当我从带有视图寻呼机的片段中返回并返回到该片段时,我有一个 IllegalStateException“递归条目到 executePendingTransactions”。我可以通过在处理程序上设置我的适配器来解决这个问题,或者使用 FragmentStatePagerAdapter 而不是 FragmentPageAdapter (请参阅在片段中显示片段视图分页器),但即使我的应用程序没有崩溃,当我使用视图寻呼机返回我的片段时,视图寻呼机消失了!
你能帮助我吗 ?
Java源代码如下,我认为布局源代码没用。
主要活动 :
public class MainActivity extends SherlockFragmentActivity{
private SherlockFragment fragmentOne, fragmentTwo, fragmentThree;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// this.fragmentOne = new fragmentOne();
// this.fragmentTwo = new fragmentTwo();
// this.fragmentThree = new fragmentThree();
// Call new or instanciate ? What's the correct way ?
this.fragmentOne = (SherlockFragment) SherlockFragment.instantiate(this, FragmentOne.class.getName());
this.fragmentTwo = (SherlockFragment) SherlockFragment.instantiate(this, FragmentTwo.class.getName());
this.fragmentThree = (SherlockFragment) SherlockFragment.instantiate(this, FragmentThree.class.getName());
// Add fragment
FragmentTransaction transaction = (
this.getSupportFragmentManager().beginTransaction()
);
transaction.add(
R.id.tab_fragment,
this.fragmentOne,
this.fragmentOne.toString()
);
transaction.commit();
}
public void onButtonSelected(View v){
switch (v.getId()){
case R.id.button_one_tab:{
showFragment(this.fragmentThree);
break;
}
case R.id.button_two_tab:{
showFragment(this.fragmentOne);
break;
}
case R.id.button_three_tab:{
showFragment(this.fragmentTwo);
break;
}
default:{
break;
}
}
}
public void showFragment(SherlockFragment fragmentToShow){
FragmentTransaction transaction = (
this.getSupportFragmentManager().beginTransaction()
);
transaction.replace(R.id.tab_fragment, fragmentToShow, fragmentToShow.toString());
transaction.commit();
}
}
片段 2 和 3 仅膨胀仅包含 TextView 的布局。片段一(请注意,我使用的是 DirectionalViewPager - 一个库 - 而不是 ViewPager):
public class FragmentOne extends SherlockFragment{
private FragmentOneAdapter fragmentOneAdapter;
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
// Set up the pager
final DirectionalViewPager pager = (DirectionalViewPager)getActivity().findViewById(R.id.pager);
if (this.fragmentOneAdapter== null){
this.fragmentOneAdapter= new FragmentOneAdapter (getActivity().getSupportFragmentManager());
}
pager.setAdapter(fragmentOneAdapter);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_landing_page, container, false);
}
片段一个适配器:
public class FragmentOneAdapter extends FragmentPagerAdapter{
private ArrayList<SherlockFragment> fragmentsList;
public FragmentOneAdapter(FragmentManager fragmentManager) {
super(fragmentManager);
SherlockFragment fragmentFour = new FragmentFour();
SherlockFragment fragmentFive = new FragmentFive();
this.fragmentsList = new ArrayList<SherlockFragment>();
this.fragmentsList.add(fragmentFour);
this.fragmentsList.add(fragmentFive);
}
@Override
public Fragment getItem(int position) {
return this.fragmentsList.get(position);
}
@Override
public int getCount() {
return this.fragmentsList.size();
}
}
感谢您的帮助!