5

まず、これらのサブジェクトがstackoverflowで多くの時間を作成されていることは知っていますが、問題の解決策が見つかりません。第二に、私はフランス語なので、私の英語は完璧ではありません。事前に申し訳ありませんが、何かわからないことがあれば教えてください。そして、この紹介を終えるにあたり、フラグメントを扱うのは初めてなので、よくわからないことがあればごめんなさい!

3つのフラグメントを切り替えることができる3つのボタンがあります。これらのフラグメントの1つの中に、2つのフラグメントを持つビューページャーがあります。今のところ、各フラグメント(5つあります)には、TextViewのみが含まれています。私は最新バージョンのandroid-support-v4を使用しています(最新バージョンのサポートが「Recursiveentry toexecutePendingTransactions」エラーを解決するというstackoverflowの件名をたくさん読みました)。

私の2つの問題:

  • 1つのボタンを2回クリックすると、IllegaleStateException「フラグメントのタグを変更できません」が発生します。onButtonSelectedメソッドで新しいフラグメントを作成することでこれを修正できましたが、メモリ上の理由と機能上の理由から、毎回フラグメントを再作成したくありません。フラグメントは彼女の状態を維持する必要があります。この問題は私の主な問題ではありません。実際、ユーザーがすでにフラグメント化されているときにボタンを無効にすることは可能ですが、この管理が行われていないときに例外が発生するのは奇妙です。

  • ビューページャーを使用してフラグメントから出て、このフラグメントに戻ると、IllegalStateException「executePendingTransactionsへの再帰的エントリ」が発生します。アダプターをハンドラーに設定するか、FragmentPageAdapterの代わりにFragmentStatePagerAdapterを使用することでこれを修正できます(フラグメント内のフラグメントビューページャーの表示を参照)が、アプリケーションがクラッシュしなくても、ビューページャーでフラグメントに戻ると、ビューページャーが消えました!

手伝って頂けますか ?

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のみを含むレイアウトのみを膨らませます。フラグメント1(ViewPagerの代わりにDirectionalViewPager(lib)を使用していることに注意してください):

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();
}

}

あなたの助けを前もってありがとう!

4

1 に答える 1

3

私は自分の問題を解決しました!

に置き換えるだけgetSupportFragmentManager()です。次に、3つの異なるインスタンスを使用する代わりに、毎回フラグメントの新しいインスタンスを作成することで、メソッドを編集しました(これを行わない場合は、例外があります:) 。FragmentOnegetChildFragmentManager()onButtonSelectedjava.lang.IllegalStateException: Activity has been destroyed

fragmentOneこの解決策にはまだ問題があります。 、fragmentTwoとを切り替えるたびに、各フラグメントの状態が失われfragmentThreeます。そのための解決策はありますか?

于 2013-04-19T14:37:53.903 に答える