LoginSignup
2
2

More than 5 years have passed since last update.

アクティビティクラスを文字列で指定して起動する

Posted at

機能評価のアプリを作る際、評価する機能毎にアクティビティを分割することがよくある。

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();
        }
    }

    ...
2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2