首先,我知道这些主题在stackoverflow上已经花了很多时间,但是我没有找到解决问题的方法。其次,我是法国人,所以我的英语并不完美,对不起,请告诉我您是否听不懂。结束本介绍,这是我第一次处理 fragment ,因此,对不起,如果有我不了解的内容,对不起!
我有三个按钮,可以在三个 fragment 之间切换。
在这些 fragment 之一中,我有一个包含两个 fragment 的 View 寻呼机。目前,每个 fragment (有5个)仅包含一个TextView。
我正在使用最新版本的android-support-v4(我在stackoverflow中读了很多主题,说最新版本的支持解决了我遇到的“递归输入executePendingTransactions”错误)。
我的两个问题:
你能帮助我吗 ?
Java源代码在下面,我认为布局源代码是没有用的。
主要 Activity :
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();
}
}
fragment 2和 fragment 3仅会使仅包含TextView的布局膨胀。
fragment 一(请注意,我使用的是DirectionalViewPager-lib-而不是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);
}
FragmentOneAdapter:
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();
}
}
预先感谢您的帮助!
最佳答案
我已经解决了我的问题!
我只是将getSupportFragmentManager()
上的FragmentOne
替换为getChildFragmentManager()
。然后,我通过每次创建一个新的fragment实例而不是使用三个不同的实例来编辑onButtonSelected
的方法(如果我不这样做,则有一个异常(exception):java.lang.IllegalStateException: Activity has been destroyed
)。
这个解决方案仍然有一个问题:每次在fragmentOne
,fragmentTwo
和fragmentThree
之间切换时,我都会丢失每个 fragment 的状态。您对此有解决方案吗?
关于android - 处理 fragment 并查看传呼机: can't change tag of fragment AND Recursive entry to executePendingTransactions,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15076839/