2017-02-23 6 views
3

フラグメントについて学習し始めました。私はフラグメントに変換したコードの1000行以上のアクティビティを持っています。フラグメント内からのアクティビティボタンのクリックをリッスンします

フラグメントが親アクティビティのXMLにあるボタンをリッスンできるようにする簡単な方法があるのだろうかと思います。私はちょうどそのフラグメントのonCreateViewのIDで定期的なリスナーを追加しようとしましたが、それは(私が)nullポインタの例外を与える(予想通り)です。

これを行う方法はOnSearchClickListenerですが、私が必要とするものを達成するためには、手動でリファクタリングするのにはかなりの時間がかかります(少なくとも、その使用法については私が知る限りでは間違っている)ので、私は誰もこれを非反復的なやり方で行うための他の方法を知っているのだろうかと思っていました。

+0

は、活動およびフラグメントの間の通信のためのインタフェースを実装します。参照:http://simpledeveloper.com/how-to-communicate-between-fragments-and-activities/ – nnn

+0

これはインターフェイスを使用してこれを達成できます。あなたのフラグメントがインターフェイスを実装し、インターフェイスメソッドをオーバーライドして、目的の機能を実行します。 – Bhargav

答えて

4

あなたは活動で、このように、ビューの参照を取得しようとすることができます:

View view = getActivity().findViewById(R.id.view_in_activity); 

その後、リスナーを追加します。

view.setOnClickListener(new OnClickListener() { 
    void onClick(View v) { 
     // Perform some action 
    } 
}) 
+0

これは私の質問に対する正解ですが、他の回答からの断片化したコミュニケーション(インタフェース)の他の形についても学びました(ありがとうございました)。 – Zuhayr

2

ClickListenerOnActivityのように呼ばれるインタフェースはonClickInActivity(View v)という名前のメソッドが含まれている定義し、それを実装断片化している。アクティビティのボタンをクリックすると、このインタフェースのメソッドが呼び出されます。

このexampleを表示すると、インターフェイスの実装方法を確認できます。エムレAkturkの答えにもかかわらず

1

は間違っていないですが、それは、したがって、あなたがActivityViewことを持たない可能性があることを、あなたのFragmentActivityにし、その後に添付して、ベストプラクティスではありません。したがって、最も良い方法はinterfaceです。 Fragmentで目的のインターフェイスを実装し、次にButtononClickListenerにそのFragmentのインターフェイスを呼び出します。活動に

4
フラグメントで

次のようにします。..

public class Myfragment extends Fragment { 

    public interface Callback { 
     public void onButtonClicked(View radiobtn); 
    } 

    private Callback callback; 

    @Override 
    public void onAttach(Activity ac) { 
     super.onAttach(ac); 
     callback = (Callback) ac; 
    } 

    @Override 
    public void onDetach() { 
     callback = null; 
     super.onDetach(); 
    } 

    radiobtn.setOnClickListener(new OnClickListener() { 
     public void onClick(View view) { 
      if (callback != null) { 
       callback.onButtonClicked(view); 
      } 
     } 
    }); 
} 

次のように行います...

public class Myfragment extends Activity implements MyFragment.Callback{ 

    public void onButtonClicked(View btn) { 
     // The radiobutton in MyFragment has been clicked 
     myButton.setEnabled(true); // or something like this. 
    } 
} 
関連する問題