Android

How can I start a new android activity using class name in a string?

Как я могу запустить новое действие Android, используя имя класса в строке?

У меня проблема с приложением для Android, над которым я работаю.

В моем приложении есть несколько разделов, и следующий загружаемый экран основан на строке. Итак, экран 1 раздела 1 будет S1S1.

Мой вопрос в том, как я могу запустить действие на основе строки. У меня есть S1S1, сохраненный в строке, давайте назовем его next activity. Вместо того, чтобы вводить S1S1.class, мне нужно, чтобы оно исходило из строки. Я перепробовал все, что смог придумать, и Google не сильно помог.

Вот некоторые вещи, которые я пробовал

Intent myIntent = new Intent(nextactivity);
Intent myIntent = new Intent(v.getContext(), getClass().getName().valueOf(nextactivity));
Intent myIntent = new Intent(v.getContext(), Class.forName(nextactivity));

и попробовал запустить с

startActivityForResult(myIntent, 0); 

но, похоже, ничего не работает. Есть идеи?

Переведено автоматически
Ответ 1

Вот код, с помощью которого вы можете запустить действие, используя имя действия

String activityToStart = "com.example.MainActivity";
try {
Class<?> c = Class.forName(activityToStart);
Intent intent = new Intent(this, c);
startActivity(intent);
} catch (ClassNotFoundException ignored) {
}

Редактировать

Здесь имя класса будет полным именем класса с именем пакета. Например, если ваше имя пакета будет x.y.z и если у вас есть имя действия, вызываемое A, то полное имя (activityToStart) действия A будет x.y.z.A.

Ответ 2

Еще лучший способ (и тот, который используется в системе для запуска Browser.apk вместе с другими приложениями, которые не поставляются в комплекте с AOSP):

Intent intent = new Intent();
intent.setClassName("com.android.browser","com.android.BrowserActivity");

context.startActivity(intent);

В качестве альтернативы, если вы хотите проверить, что вы можете запустить Activity из командной строки, вы можете сделать что-то подобное из своей оболочки:

adb shell
am start com.android.browser/.BrowserActivity
Ответ 3

Я не знаю решения, но у меня есть альтернатива.. способ, аналогичный скрытию и отображению div на веб-страницах.

если ваш s1s1 загружает низкое содержимое, разместите их в linearlayout и сохраните их видимость при загрузке формы s1. когда вы нажимаете на s1, чтобы достичь s1s1, скрываете s1 и устанавливаете параметры видимости на "visible".

Делая это, вы можете избежать создания отдельного действия, и таким образом также легко вернуться назад.

Ответ 4

Используйте перечисления!

public enum SectionActivity {

S1S1(MyS1Activity.class),
S1S2(S2Activity.class);

private Class<? extends Activity> activityClass;

private SectionActivity(Class<? extends Activity> clazz) {

this.activityClass = clazz;
}

public Class<? extends Activity> getActivity {
return activityClass;
}
}

Затем где-то в вашем коде:

SectionActivity act = SectionActivity.valueOf(string);
Intent intent = new Intent(this, act.getActivity());
startActivity(intent);
2023-11-29 04:23 java android string android-activity