2016-03-26 2 views
1

こんにちは皆、コールフラグメントの方法

[はじめに]私はMainActivityで4つのフラグメントを処理するためにScreenSlide Pager(FragmentActivityの延長)を作成しました。私はまた、ブルートゥースの通信ソケット(RPI付き)を扱うサービスを持っています。 このサービスは、ハンドラを介してMainActivityを受け取るMainActivityに通知できます。ここ

それは、MainActivityに配置される。そして、

if(savedInstanceState == null){ 
      FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
      ft.add(R.id.pager, new MainFragment()); 
      ft.commit(); 
     } 

class IncomingHandler extends Handler { 
     @Override 
     public void handleMessage(Message msg) { 
      switch (msg.what) { 
       case BtCommunication.MSG_SET_VALUE: 
        Log.d("SERVICE", "Received from service: " + msg.arg1); 
        break; 
       case BtCommunication.MSG_GET_SOCKET_STATE: 
        if(msg.arg1 == 1){ 
         Log.d("SERVICE", "Socket state: UP"); 
         onSocketUp(); 
        } else { 
         Log.d("SERVICE", "Socket state: DOWN");} 
        break; 
       default: 
        super.handleMessage(msg); 
      } 
     } 
    } 

IはOnCreate関数()内の任意の他のフラグメントの前に最初に呼び出される断片(MainFragment)を有しますフラグメントはMainActivityのScreenSlidePagerAdapterでこのように処理されます。

@Override 
     public Fragment getItem(int position) { 
      Log.d("mPager.getCurrentItem", "" + mPager.getCurrentItem()); 
      if(position == 0){ 
       actionBar.setTitle("Accueil - Connexion"); 
       Log.d("Fragment", "MainFragment"); 
       return new MainFragment(); 
      }else if(position == 1){ 
       actionBar.setTitle("Second fragment"); 
       Log.d("Fragment", "SecondFragment"); 
       return new SecondFragment(); 
      }else if(position == 2){ 
       Log.d("Fragment", "ThirdFragment"); 
       return new ThirdFragment(); 
      }else if(position == 3){ 
       Log.d("Fragment", "ItemFragment"); 
       return new ItemFragment(); 
      }else{ 
       Log.d("Fragment", "ElseFragment (MainFragment)"); 
       return new MainFragment(); 
      } 
     } 

ソケットが起動していないですが、私は彼がロードアニメーション(アニメーションがうまく機能している)を表示したい:animation loader

接続ソケットがUPされたら、私はこのフラグメントのメソッドを持っています不可視/読み込みアニメーションを設定します。 [/はじめに]

public void onSocketUp(){ 
     ArcLoader.setVisibility(View.GONE); 
     Log.d("MAIN FRAGMENT","Arc Loader GONE"); 
    } 

私はあなたがそれを推測想定しています。私は、が活動からDOWNからUPにたびソケット状態のスイッチをそのメソッドを呼び出したいです。

以下はアクティビティの方法です。私はという喧嘩をしています。彼女は、ハンドラがサービスからの通知を検出すると正しく呼び出されますが、findfragmentbyIdがmFragをnullフラグメント(?!)として返すため、フラグメントのメソッドを呼び出すことができません。

これは、最初に呼び出された断片であり、私はそれを破壊しないからです。)

さらに、トランザクションでの新しいフラグメントの作成が失敗します(onSaveInstanceStateの後にこのアクションを実行できません)。

private void onSocketUp() 
    { 
     //Fragment mainFrag = getSupportFragmentManager().findFragmentByTag("android:switcher:" + R.id.pager + ":" + mPager.getCurrentItem()); 
     Fragment mainFrag = getSupportFragmentManager().findFragmentById(R.id.mainfragment); 
     Log.d("MAIN ACTIVITY", "onSocketUp()"); 
     if (mPager.getCurrentItem() == 0 && mainFrag != null) { 
      mainFrag.onSocketUp(); 
      Log.d("SERVICE", "onSocketUp() called - Main Fragment instantiated"); 
     } 
     else { 

      MainFragment newFragment = new MainFragment(); 
      Bundle args = new Bundle(); 
      args.putString(MainFragment.ARG_SOCKET_UP, "UP"); 
      newFragment.setArguments(args); 

      FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); 

      transaction.replace(R.id.pager, newFragment); 
      transaction.addToBackStack(null); 
      transaction.commit(); 
     } 
    } 

私はあなたが私には、追加のコードを供給したい場合は躊躇しないで、私はあなたに私の問題から来たんどこ得るために、すべての十分な情報を与えたいと考えています。

私が読むことができる他のすべてのトピックは、今まで助けていません。

ありがとうございます。あなたは活動からのフラグメントのメソッドを呼び出したい場合は

+0

、しかし何を後で使用すること)(mFrag.onSocketUp」であります" mFragはインスタンス化されたものではありません。多分問題はここから来るでしょう。 – Xema

+0

が編集されましたが、それは問題の原因ではありませんでした。 – Amesys

答えて

0

だけで、次の操作を行います。「onSocketUp()」あなたは「mainFrag」を宣言して

Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.mainfragment); 

if (fragment instanceof MainFragment){ 
    ((MainFragment)fragment).onSocketUp(); 
} 
+0

if条件が満たされていません。しかし、findFragmentbyIdが呼び出されます。なぜか分からない。 – Amesys

+0

私はそれを行う一般的な方法を投稿しましたが、あなたの例では、あなたのアーキテクチャを見直す必要があると思います。 あなたのフラグメント全体に 'onSocketUp'が必要な場合は、それをあなたのメインアクティビティに展開してください – Mehdi

+0

どのようにして、そのアクティビティのフラグメントに対してアクションを実行しますか? – Amesys