2011-04-22 26 views
24

我遇到了一個我正在處理的Android應用程序的問題。如何使用字符串開始新的android活動?

我的應用程序有幾個部分,下一個加載的屏幕是基於字符串的。因此,第1部分的屏幕1將是S1S1。

我的問題是,我怎樣才能啓動一個基於字符串的活動。我將S1S1保存在一個字符串中,讓我們稱它爲nextactivity。我不需要輸入S1S1.class,而是需要它來自字符串。我已經與我所能做的一切交流,谷歌並沒有真正幫助。

有些事情我已經試過是

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

運行,但似乎沒有任何工作。有任何想法嗎?

回答

52

這裏是您可以使用活動

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

編輯

的名字開始活動代碼這裏的類名將是p類的全名ackage名稱。 例如,如果您的包名稱將爲x.y.z,並且您的活動名稱爲A,那麼活動A的全名將爲x.y.z.A

+0

我用「End」取代了StringClassname,這是一個我知道存在的活動..但是我得到的是一個ClassNotFoundException和一個java.lang.NullPointerException,我用v替換了mail.this。 getContext(),我也試過「End.class」,但那也沒做任何事。 – fahadayaz 2011-04-22 12:12:18

+0

查看編輯答案編輯@fahadayaz – Dharmendra 2011-04-22 12:27:43

+0

啊,現在效果很好!謝謝! – fahadayaz 2011-04-22 12:35:55

-1

使用枚舉!

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); 
+0

該解決方案爲我工作過,但因爲對方是更少的代碼,更直接,很可能工作得更快。這也將有它的用途,雖然..謝謝! – fahadayaz 2011-04-22 12:37:45

+0

我會不同意你的看法。另一個解決方案使用反射,也可以在try塊中使用。這當然是一個衡量問題,但我至少不確定誰的解決方案更快。此外,枚舉是一個最終的類,它的成員是靜態的最終,所以android會優化它。 – 2011-04-22 12:57:24

+0

有趣!有沒有一種工具可以讓我使用不同的方法來衡量性能?我確實得到了兩個工作,所以我不妨看看哪個更優化。 – fahadayaz 2011-04-22 13:07:35

0

我不知道解決方案,但我有一個替代方案..類似div的方式隱藏和顯示在網頁中。

如果您的s1s1要加載低內容,請將它們放在線性佈局中,並在加載表單s1時保持其可見性。當你點擊s1到達s1s1時隱藏s1並將可見度參數設置爲「可見」。

通過這樣做,您可以避免創建一個單獨的活動,這種方式也很容易導航回來。

+0

感謝您的提示!我將銘記未來。 :) – fahadayaz 2011-04-22 13:36:32

27

(即在系統中使用與未與AOSP捆綁以及其他應用推出Browser.apk和一個)一個更好的方法:

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

context.startActivity(intent); 

另外,如果你想檢查您可以從命令行Activity,你可以從你的shell做這樣的事情:

adb shell 
am start com.android.browser/.BrowserActivity 
+0

如果未找到活動,會發生什麼情況?這種情況發生時的一個例子是調味的gradle版本,不包括某些類。 – 2014-11-13 18:07:13

+6

這是最好的答案。你也可以這樣做: 'intent.setClassName(context,context.getPackageName()+「.MyActivity」);' – Richard 2015-06-04 18:52:21

+0

工程就像一個魅力。 – 2016-01-15 10:04:58