2016-11-01 3 views
0

私のプロジェクトは、個々のメニューページのフラグメントを使用するナビゲーションアクティビティを中心に動作します。私は、(ナビゲーションメニューのアイコンとは対照的に)ボタンをクリックすることで他のフラグメントを開くことができるようにしたいと思いますが、これをどのように達成するかわかりません。私は以下の両方のリソースを見てきましたが、私はそれらを十分に理解していません。Android Studio:フラグメント内のフラグメントとアクション間の移動

How can I make my button to do something in Fragments,ViewPager https://developer.android.com/training/basics/fragments/communicating.html

さらに、ボタンをクリックしても、アプリバーを使用しています主な活動でコードを呼び出す必要があります。

誰かが私に希望の効果を達成する方法を説明することができれば、それは素晴らしいことです。

答えて

0

フラグメントからボタンを押してフラグメントを開く場合は、コールは現在のアクティビティを通過する必要があります。

アクティビティへのコールバックを作成し、ボタンを押したときにそのコールバックを呼び出します。次に、コールバックが呼び出されたときにアクティビティが2番目のフラグメントを起動します。

このように、最初のフラグメントは2番目のフラグメントについて何も知る必要はありません。このアクティビティは、同じアクティビティ内のフラグメント間のナビゲーションを処理します。

私はこれが最もクリーンで簡単な解決策だと思います。

編集:私は基本的に質問に掲載されたアンドロイドのドキュメントへのリンクと同じと言っています。私はこれが最善の解決策だと思う。

0

簡単のため:活性= [A]、フラグメント1 = [B]、及びフラグメント2 = [C]

ステップ1:[B]はIOnInitiate[C]Listenerと呼ばれる内部インタフェースを作成し、そのインターフェース内に作成メソッドvoid Initiate[C]();と呼ばれます。

ステップ2:IOnInitiate[C]Listenerの[B]内にプライベートプロパティを作成し、(your-prefix-convention)OnInitiate[C]Listenerとします。

工程3:[B] public void SetInitiate[C]Listener(Activity activity)と呼ば内パブリックメソッドを作成し、ステップで作成された私有地にactivityパラメータをキャスト2.

ステップ4:[A] インタフェースを実装する必要があり[B].IOnInitiate[C]Listenerとメソッドpublic void Initiate[C]()

ステップ5:[A]から、[B]の新しいインスタンスを作成するたびに、ステップ3のメソッドを呼び出して、アクティビティパラメータとしてthisを渡してください。それ以外の場合は、null例外が発生します。

ステップ6:[B]から[C]を開始する必要があるときは、[B]のプライベートプロパティからインターフェイスメソッドを呼び出すだけです。例:(prefix)OnInitiate[C]Listener.Initiate[C]();

これは私の見た目です。開発にはC#を使用しているため、構文が異なる場合があります。

public class A : Activity, B.IOnInitiateCListener 
{ 
    private void InitiateB() 
    { 
     B b = new B(); 
     b.SetInitiateCListener(this); 
     b.Show(FragmentManager, "B"); 
    } 

    public void InitiateC() 
    { 
     C c = new C(); 
     c.Show(FragmentManager, "C"); 
    } 
} 

public class B : Fragment 
{ 
    public interface IOnInitiateCListener 
    { 
     void InitiateC(); 
    } 

    private IOnInitiateCListener _IOnInitiateCListener; 

    public void SetInitiateCListener(Activity activity) 
    { 
     _IOnInitiateCListener = (IOnInitiateCListener)activity; 
    } 

    private void InitiateC() 
    { 
     _IOnInitiateCListener.InitiateC(); 
    } 
} 
関連する問題