機能評価のアプリを作る際、評価する機能毎にアクティビティを分割することがよくある。
ListViewのタップされた位置から起動するアクティビティをif文の分岐で書くのが簡単だが、アクティビティが増えると表示するテキストとアクティビティの指定を間違えやすくなる。
なので、最近はこんな風にクラスの文字列からクラスを取得するようにしている。
try {
String classname = "HogeActivity";
Class<?> cls = Class.forName(getActivity().getPackageName() + "." + classname);
Intent intent = new Intent(getActivity(), cls);
startActivity(intent);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
具体的には、 strings.xmlでアクティビティのリストを定義して
strings.xml
<string-array name="activities">
<item>Sample1Activity</item>
<item>Sample2Activity</item>
<item>Sample3Activity</item>
</string-array>
以下の様なリストフラグメントを作って
MainActivityFragment.java
public class MainActivityFragment extends ListFragment {
private String[] mStrings;
public MainActivityFragment() {
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
mStrings = getActivity().getResources().getStringArray(R.array.activities);
ListAdapter adapter = new ArrayAdapter<>(getActivity(), android.R.layout.simple_list_item_1, mStrings);
setListAdapter(adapter);
}
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
try {
String classname = mStrings[position];
Class<?> cls = Class.forName(getActivity().getPackageName() + "." + classname);
Intent intent = new Intent(getActivity(), cls);
startActivity(intent);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
MainActivityでこれを表示する。
MainActivity.java
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (savedInstanceState == null) {
setContentView(new FrameLayout(this));
MainActivityFragment fragment = new MainActivityFragment();
getSupportFragmentManager().beginTransaction().replace(android.R.id.content, fragment, "fragment").commit();
}
}
...