Last active
July 3, 2018 09:28
-
-
Save mstssk/7123411 to your computer and use it in GitHub Desktop.
FragmentからActivityにコールバックする手段の一つとして、listenerをserializableにしてargmentsに詰めてしまうやり方を試してみた。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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); | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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); | |
} | |
} | |
} |
結局、気にする事と行数が増えてしまうので、大して良い手段ではない。
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
・listenerをargmentsに入れることで、fragmentの再生成時を気にしなくて済むように
・fragment内の実装ではlistenerはlistenerとしてだけ扱うように
(親activityがlisterを実装していることを期待してcastするやり方はなんか好きになれないので)
・listenerの実装クラスを内部クラスで作る場合はstaticでなければならなくなった
(仮にstaticを付け忘れても、動かしたらすぐ落ちて気付くので、さほど気にしていない)
・listenerがstaticのためactivityのフィールドやメソッドを直接参照出来ないが、必要に応じてactivityにcastすればいい。
内部クラスならfragmentの親activityが何なのかは明白になるので、気にせずcastしてしまえ。