Skip to content

Instantly share code, notes, and snippets.

@mstssk
Last active July 3, 2018 09:28
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mstssk/7123411 to your computer and use it in GitHub Desktop.
Save mstssk/7123411 to your computer and use it in GitHub Desktop.
FragmentからActivityにコールバックする手段の一つとして、listenerをserializableにしてargmentsに詰めてしまうやり方を試してみた。
package com.example.fragmenttest;
import java.io.Serializable;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.v4.app.DialogFragment;
public class HogeFragment extends DialogFragment {
public static final String TAG = "HogeFragment";
private static final String KEY_CALLBACKS = "callbacks";
public static HogeFragment newInstance(final Callbacks callbacks) {
final Bundle args = new Bundle();
args.putSerializable(KEY_CALLBACKS, callbacks);
final HogeFragment fragment = new HogeFragment();
fragment.setArguments(args);
return fragment;
}
/**
* @deprecated use {@link HogeFragment#newInstance(Callbacks)}
*/
@Deprecated
public HogeFragment() {
}
private Callbacks getCallbacks() {
return (Callbacks) getArguments().getSerializable(KEY_CALLBACKS);
}
@Override
public Dialog onCreateDialog(final Bundle savedInstanceState) {
final Builder builder = new AlertDialog.Builder(getActivity());
builder.setTitle("HogeFragment");
builder.setPositiveButton(android.R.string.ok, mListener);
builder.setNegativeButton(android.R.string.no, mListener);
return builder.create();
}
private final DialogInterface.OnClickListener mListener = new DialogInterface.OnClickListener() {
@Override
public void onClick(final DialogInterface dialog, final int which) {
switch (which) {
case DialogInterface.BUTTON_POSITIVE:
getCallbacks().onHoge(HogeFragment.this, "OK");
break;
case DialogInterface.BUTTON_NEGATIVE:
getCallbacks().onHoge(HogeFragment.this, "NO");
break;
default:
break;
}
}
};
public interface Callbacks extends Serializable {
void onHoge(HogeFragment fragment, String value);
}
}
package com.example.fragmenttest;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.widget.Toast;
public class MainActivity extends FragmentActivity {
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (savedInstanceState == null) {
final HogeFragment fragment = HogeFragment.newInstance(new MyCallbacks());
getSupportFragmentManager().beginTransaction().add(fragment, HogeFragment.TAG).commit();
}
}
private void showToast(final String value) {
Toast.makeText(this, value, Toast.LENGTH_SHORT).show();
}
@SuppressWarnings("serial")
private static class MyCallbacks implements HogeFragment.Callbacks {
@Override
public void onHoge(final HogeFragment fragment, final String value) {
((MainActivity) fragment.getActivity()).showToast(value);
}
}
}
@mstssk
Copy link
Author

mstssk commented Oct 23, 2013

・listenerをargmentsに入れることで、fragmentの再生成時を気にしなくて済むように
・fragment内の実装ではlistenerはlistenerとしてだけ扱うように
 (親activityがlisterを実装していることを期待してcastするやり方はなんか好きになれないので)
・listenerの実装クラスを内部クラスで作る場合はstaticでなければならなくなった
 (仮にstaticを付け忘れても、動かしたらすぐ落ちて気付くので、さほど気にしていない)
・listenerがstaticのためactivityのフィールドやメソッドを直接参照出来ないが、必要に応じてactivityにcastすればいい。
 内部クラスならfragmentの親activityが何なのかは明白になるので、気にせずcastしてしまえ。

@mstssk
Copy link
Author

mstssk commented Oct 23, 2013

結局、気にする事と行数が増えてしまうので、大して良い手段ではない。
activityにinterface付けてfragmentのonAttachで見に行くやり方の方が手っ取り早いしベター。

Y.A.M の 雑記帳: Fragment から Activity にコールバックする方法
http://y-anz-m.blogspot.jp/2012/06/fragment-activity.html

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment