新人成長記録11th
前回の記事でも書いた通り、今回はFragmentのイベントをActivityで受け取る内容となります
例えばFragment上のボタンを押した時に、Activityで処理を書きたい時などに使えます
Fragmentの実装
Fragmentにはinterfaceとボタンを押した時の処理を記述します
まず初めに、interfaceを以下のように実装します
public interface Mylistener{
void onClickToast();
}
interfaceは宣言のみで実装はしない!でした
Mylistenerの部分は好きな名前で大丈夫です
void onClickToast()の部分がActivity側に実装するメソッドとなります
また、Fragmentのライフサイクルの初めに以下のようにリスナを設定します
public void onAttach(Context context){
super.onAttach(context);
if(context instanceof Mylistener){
mylistener = (Mylistener) context;
}
}
if文内の”context instanceof Mylistener”では、受け取ったcontextにMylistenerが実装されているかをチェックします
trueならばリスナをセットします
これでinterfaceのメソッドを使用する準備は万端です
今回はボタンを押された時にメソッドを実行したいので以下のように実装します
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle bundle){
View root = inflater.inflate(R.layout.fragment,container,false);
Button button = (Button) root.findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(mylistener != null){
mylistener.onClickToast();
}
}
});
return root;
}
Activityの実装
Activity側では、以下のように先ほどのinterfaceをimplementsで実装していきます
public class MainActivity extends Activity implements Fragment1.Mylistener{
public void onCreate(Bundle bundle){
super.onCreate(bundle);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.mainactivity);
}
}
このままでは何も起きないですし、ビルド時に怒られてしまいます
interfaceで宣言されているメソッドをすべて実装しないといけませんね
実装結果が以下です
public void onClickToast(){
Toast.makeText(this,"Fragmentのボタンが押されました",Toast.LENGTH_SHORT).show();
}
これですべての実装が完了しました
Fragment内にあるボタンを押すことでActivity上のonClickToastが呼ばれ、Toastを表示することができます
終わりに
interfaceで外部に実装することは多くあり、必要な知識であるということは、業務に触れることによって実感しています
早いうちに学ぶ機会があり、記事にすることで理解を深めることができたと思います
少しずつですが、Android開発のことを理解してくると開発が楽しくなってきます
火曜日担当:poppy
admin at 2016年10月25日 10:03:10