【发布时间】:2011-10-25 20:36:37
【问题描述】:
朋友们,美好的一天。 我有一个 PreferenceActivity,它是从 XML 文件中填充的。 当我们按下一个项目时,我们应该启动新的活动。怎么做?我应该在 XML 文件或 Java 类中写什么?
【问题讨论】:
标签: android android-activity android-preferences preferenceactivity
朋友们,美好的一天。 我有一个 PreferenceActivity,它是从 XML 文件中填充的。 当我们按下一个项目时,我们应该启动新的活动。怎么做?我应该在 XML 文件或 Java 类中写什么?
【问题讨论】:
标签: android android-activity android-preferences preferenceactivity
您必须在要启动活动的视图中注册一个 onClickListener。然后,在此方法中,您只需要使用意图调用活动即可。像这样的:
Intent intent = new Intent(this, ActivityToLaunch.class);
// Start boardgame
startActivity(intent);
【讨论】:
使用添加首选项后
addPreferencesFromResource(R.xml.preferences);
找到您想要设置 onClick 的首选项
findPreference("foo_bar_pref");
并通过强制转换来定义它
Preference fooBarPref = (Preference) findPreference("foo_bar_pref");
然后你可以很容易地设置它的 onClick 使用
fooBarPref.setOnPreferenceClickListener (new OnPreferenceClickListener()){...}
您可以在该侦听器中启动新的 Activity(使用 Intent)。
【讨论】:
applicationId,我的解决方案可能会对您有所帮助! stackoverflow.com/a/27053915/499125
这是动态添加首选项的好教程...稍后您必须自定义自己的方式。
在 XML 中:
<Preference android:key="key" android:title="See Android Market"></Preference>
在 Java 类中:
Preferences preferences=findPreference("key");
preferences.setIntent(new Intent(Intent.ACTION_VIEW,Uri.parse("https://market.android.com/")));
或
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.preference.CheckBoxPreference;
import android.preference.DialogPreference;
import android.preference.Preference;
import android.preference.PreferenceActivity;
import android.preference.PreferenceCategory;
import android.preference.PreferenceScreen;
import android.widget.LinearLayout;
import android.widget.ListView;
public class SettingsActivity extends PreferenceActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
/* Some initializations */
LinearLayout layout = new LinearLayout(this);
layout.setOrientation(LinearLayout.VERTICAL);
ListView listView = new ListView(this);
listView.setId(android.R.id.list);
listView.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT,LinearLayout.LayoutParams.WRAP_CONTENT, 1));
layout.addView(listView);
this.setContentView(layout);
/* Preferences time! (we build the preferences) */
Preference version = getPreference("My School Manager", "Version 2.0",null);
Preference author = getPreference("Author", "Balu", null);
Preference marketLink = getPreference("Android market","View all my apps :)",new Intent(Intent.ACTION_VIEW, Uri.parse("http://market.android.com/")));
CheckBoxPreference check = new CheckBoxPreference(this);
check.setTitle("Checkbox");
check.setSummary("Example of checkbox");
DialogPreference license = new MyDialogPreference(this, "License","This is the license for...bla bla");
/* Now we add the preferences to the preference screen */
PreferenceScreen preferenceScreen = this.getPreferenceManager()
.createPreferenceScreen(this);
addPreferenceCategory(preferenceScreen, "Preferences Tutorial",version, author, marketLink, check, license);
this.setPreferenceScreen(preferenceScreen);
}
private boolean addPreferenceCategory(PreferenceScreen preferenceScreen,
String titleCategory, Preference... preferences) {
boolean addPreference = false;
for (Preference preference : preferences) {
if (preference != null)
addPreference = true;
}
if (addPreference) {
PreferenceCategory preferenceCategory = new PreferenceCategory(this);
preferenceCategory.setTitle(titleCategory);
preferenceScreen.addPreference(preferenceCategory);
for (Preference preference : preferences) {
if (preference != null)
preferenceCategory.addPreference(preference);
}
return true;
} else
return false;
}
private Preference getPreference(String title, String summary, Intent intent) {
Preference pref = new Preference(this);
pref.setTitle(title);
pref.setSummary(summary);
if (intent != null)
pref.setIntent(intent);
return pref;
}
public class MyDialogPreference extends DialogPreference {
public MyDialogPreference(Context context, String title, String text) {
super(context, null);
this.setTitle(title);
this.setDialogMessage(text);
}
}
}
【讨论】:
鉴于您使用的是 xml 首选项,您可以将代码直接添加到 xml 中:
<Preference
android:title="Some Title"
android:summary="Some Description">
<intent
android:action="android.intent.action.VIEW"
android:targetPackage="com.package.name"
android:targetClass="com.package.name.ActivityName"
/>
</Preference>
【讨论】:
ActivityNotFoundException 的人,您可能像我一样不正确地使用子包名称。如果是这种情况,请仅使用 targetClass 部分中的子包。 <intent android:action="android.intent.action.VIEW" android:targetPackage="com.package.name" android:targetClass="com.package.name.subpackage.ActivityName" />
applicationId,我的解决方案可能会对您有所帮助! stackoverflow.com/a/27053915/499125
如果您使用 gradle over ant 作为构建工具,并且在 android 中声明了 applicationId。
[build.gradle]:
android {
defaultConfig {
...
applicationId "com.overriding.package.name"
}
...
}
这将覆盖您在AndroidManifest.xml 的android:package 中声明的任何值作为您应用的唯一标识符!
[AndroidManifest.xml]
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.my.package">
<activity android:name=".settings.MyActivity"/>
</manifest>
<intent> 必须同时考虑两个包名!
<Preference
android:title="Some Title"
android:summary="Some Description">
<intent
android:targetPackage="com.overriding.package.name"
android:targetClass="com.my.package.settings.MyActivity/>
</Preference>
【讨论】: