Fragmentは public static XxxFragment newInstance(Bundle args);を実装している想定。
画面遷移時は、FragmentからならWrapperActivity.openFragmentActivity(getActivity(), SecondFragment.class, secondFragmentsArguments); という感じで行える。
package hoge.fuga.activities;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.View;
import android.view.View.OnClickListener;
import jp.arithmetic.arithmusic.R;
import jp.arithmetic.arithmusic.model.FragmentReplacer;
public class WrapperActivity extends Activity {
public static final String TAG = "WrapperActivity";
public static final String ARGS_FRAGMENT = "app-fragment";
/**
* 1つのFragmentを全面に表示する共通化Activity
* @param fromActivity
* @param clazz
* @param args
*/
public static void openFragmentActivity(Activity fromActivity, Class clazz, Bundle args) {
// setup bundle
if (args == null) {
args = new Bundle();
}
args.putString(ARGS_FRAGMENT, clazz.getName());
// setup intent
Intent i = new Intent(fromActivity, WrapperActivity.class);
i.putExtras(args);
// start activity
fromActivity.startActivity(i);
}
/**
* close
* @param fromActivity
*/
public static void closeFragmentActivity(Activity fromActivity) {
fromActivity.finish();
}
public static void closeToStartActivity(Activity fromActivity) {
Intent i = new Intent(fromActivity, SomeStartActivity.class);
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
i.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
fromActivity.startActivity(i);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_empty_container);
// intentパラメータ優先
Bundle args = (getIntent() != null) ? getIntent().getExtras() : savedInstanceState;
if (args == null) {
throw new RuntimeException("Wrapper: Empty arguments");
}
// 呼び出しFragment特定、初期化
String className = args.getString(ARGS_FRAGMENT);
if (className == null || className.isEmpty()) {
throw new RuntimeException("Wrapper: Empty class name");
}
Fragment f = null;
try {
Class clazz = Class.forName(className);
Method newInstance = clazz.getMethod("newInstance", Bundle.class);
f = (Fragment)newInstance.invoke(null, args);
replaceFragment(f);
} catch (ClassNotFoundException e) {
e.printStackTrace();
finish();
} catch (NoSuchMethodException e) {
e.printStackTrace();
finish();
} catch (IllegalAccessException e) {
e.printStackTrace();
finish();
} catch (IllegalArgumentException e) {
e.printStackTrace();
finish();
} catch (InvocationTargetException e) {
e.printStackTrace();
finish();
}
}
@Override
public void onBackPressed() {
if (getSupportFragmentManager().getBackStackEntryCount() == 1) {
closeFragmentActivity(this);
} else {
super.onBackPressed();
}
}
public void replaceFragment(Fragment f) {
getSupportFragmentManager()
.beginTransaction()
.addToBackStack(null)
.replace(R.id.empty_container, f)
.commit();
}
}
0 件のコメント:
コメントを投稿