2016-11-28 43 views
0

我的應用程序中的一個屏幕具有一個按鈕,可將用戶帶到不同的屏幕。目標屏幕由存儲在SharedPreferences中的首選項決定。如何從共享首選項設置意圖的類?使用SharedPreferences設置意圖的類值

這是目前我有按鈕:

case R.id.favoriteButton1: 
       final Intent favorite1Screen = new Intent(); 
       favorite1Screen.setClass(this, prefs.getString("favorite1Class", "")); 
       startActivity(favorite1Screen); 
       break; 

而這正是該偏好可以設置的屏幕之一: 情況下R.id.action_favorite_1:

  final SharedPreferences prefs2 = getSharedPreferences("myDataStorage", MODE_PRIVATE); 
      final SharedPreferences.Editor nEditor = prefs2.edit(); 

      nEditor.putString("favorite1Text", "Job Hazard Analysis"); 
      nEditor.putString("favorite1Color", "Safety"); 
      nEditor.putString("favorite1Intent", "Job_Hazard_Analysis"); 
      nEditor.commit(); 

      break; 

這個意圖顯然不會接受一個字符串值來設置它的類,有沒有辦法讓這個工作?

+1

我不推薦這個。使用外部輸入*直接*創建類名打開安全問題。使用某種驗證邏輯將字符串映射到Java'Class'(例如,靜態'HashMap '),以便能夠忽略意外的值。 – CommonsWare

回答

0

你甚至可以設置從意向構造這樣的背景和類:

Intent intent = new Intent(this, YourClass.class);

可以保持與setClass方法做它雖然。我認爲錯誤可能在於如何解釋類​​參考。

我想可能你的類名字符串必須是完全合格的類名。意味着包裹和所有必須被闡明。像:

`com.mypackage.myclass_name` 

然後,一旦你有一個在共享偏好,你可以嘗試:

Intent intent = new Intent(this, 'com.mypackage.myclass_name');

,或者如果不工作的嘗試:

Intent intent = new Intent(this, Class.forName('com.mypackage.myclass_name'));

+0

我試過所有這些方法,但問題仍然是它不接受字符串作爲分配類名稱的有效輸入方法。 – Xander

+0

我的歉意我正在做一個簡單的錯誤,實際上確實解決了這個問題。 – Xander

+0

@xander很高興知道。祝你好運。 – MarkSkayff

相關問題