2016-11-28 41 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

相关问题