0

つまり、フラグメントをラッパー クラス内にラップし、そのラッパーをビュー ページャーに追加しようとしています。後でこれを使用してアプリを実行すると、null ポインターに問題が発生します (フラグメントから継承し、継承されたフラグメントをビューページャーに追加するのではなく)。


説明

基本的に、ビューページャーにフラグメントを追加しています。フラグメントを追加する前に、フラグメントから継承し、別のビューにラップして、その周りにボーダーを追加します (ページ分割)。

各ページ/フラグメントは、表示されるビューを表す個別のクラスです。

このアプローチの問題は、各フラグメントを拡張し、同じボイラープレート機能を追加する必要があることです。これは理想的ではありません。また、「boardered-fragment」などの基本クラスを作成したくありません。これは、フラグメントがそこから派生したときにボーダーを認識するためです (私は思います)。

そこで、T として型指定されたフラグメント データ メンバーを含むジェネリック ラッパー クラスを作成するコンポジションを使用するだけでよいのではないかと考えました。これに関する問題は、現在のアクティビティ「アクティビティ」を取得できないように見えることです。 " フラグメント データ メンバーのコンテキストへの参照 (ラッパーで構成されます)。

アドホックな微調整を行い、手動で保存したアクティビティ参照のコピーを返す getActivity() を非表示にしました。ただし、プログラムはランダムにクラッシュします (予想どおり)。ラッパーで可能なすべての有効期間メソッドをオーバーライドしようとしましたが、内部でデータメンバーフラグメントでその有効期間メソッドを呼び出します

public override void OnSomething()
{
    base.OnSomething()

    mFragment.OnSomething()
}

しかし、それは役に立たないようです。構成されたフラグメントは現在のアクティビティ コンテキストから「隠されている」ため、必要なすべての操作を手動で行う必要があると推測しています。それらがすべて何であるかわかりませんか?

これは、私が達成しようとしていることの簡単なコード例です。詳細は以下のとおりです。さらにコードが必要な場合はお知らせください。私が持っているものをサンプル形式に適応させます。


構成(アプリ全体に多くの問題/null ポインターがある)

public class Frag1 : Fragment
{
    ...
}

public class Activity1 : Activity
{
     public override void OnCreate(Bundle bundle)
     {
         ...

         List<Fragment> fragments = new List<Fragment>();

         fragments.Add(FragmentWrapper.NewInstance(Activity, typeof(FragmentWrapper))

         MyAdapter pagerAdapter = new MyAdapter(FragmentManager, fragments);            
         ViewPager viewPager = FindViewById<ViewPager>(Resource.Id.view_pager);
         viewPager.Adapter = pagerAdapter;
     }

    public class FragmentWrapper
    {
        Fragment mFragment;   // How to successfully wrap a fragment, but still behave properly ????

        public static FragmentWrapper NewInstance(Activity activity, string type)
        {
            FragmentWrapper thisFrag = new FragmentWrapper();

            ...

            thisFrag.mFragment = Fragment.Instantiate(activity, type);

            return thisFrag;
        }

        public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle bundle)
        {
            // add boarder around mFragment and return new view
        }     
    }

    public class MyAdapter : Android.Support.V13.App.FragmentStatePagerAdapter
    {
        ....
    }
}

継承(できます、わかりました)

public class Frag1 : Fragment
{
    ...
}

public class Activity1 : Activity
{
     public override void OnCreate(Bundle bundle)
     {
         ...

         List<Fragment> fragments = new List<Fragment>();

         fragments.Add(FragmentExtender.NewInstance(Activity, typeof(FragmentExtender))

         MyAdapter pagerAdapter = new MyAdapter(FragmentManager, fragments);            
         ViewPager viewPager = FindViewById<ViewPager>(Resource.Id.view_pager);
         viewPager.Adapter = pagerAdapter;
     }

    public class FragmentExtender : Frag1
    {
        public static FragmentExtender NewInstance()
        {
            FragmentExtender thisFrag = new FragmentExtender();

            ...

            return thisFrag;
        }

        public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle bundle)
        {
            // add boarder around mFragment and return new view
        }
    }     

    public class MyAdapter : Android.Support.V13.App.FragmentStatePagerAdapter
    {
        ....
    }
}

これに関するヘルプは大歓迎です。ありがとう。

4

1 に答える 1

5

フラグメント間に境界線を追加することだけが必要な場合は、 と を確認してViewPager.setPageMargin()くださいViewPager.setPageMarginDrawable()

于 2012-12-21T16:48:39.633 に答える