从PreferenceActivity启动新活动

37

大家好, 我有一个PreferenceActivity,它是从XML文件中填充的。 当我们点击一项时,我们应该启动新的活动。怎么做?我应该在XML文件中还是在Java类中编写什么?

5个回答

77

如果您正在使用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>

24
如果你尝试在偏好设置中启动活动,并收到“ActivityNotFoundException”错误提示,可能是因为你错误地使用了子包名称,就像我曾经犯的一样。如果出现这种情况,请只在"targetClass"部分中使用子包名。<intent android:action="android.intent.action.VIEW" android:targetPackage="com.package.name" android:targetClass="com.package.name.subpackage.ActivityName" /> - Andrew T.
为了避免一些人的痛苦:你可以在<intent>标签内定义类别和额外数据,但是你不能使用XML设置意图标志。如果你想设置标志,你需要注册一个OnPreferenceClickListener并手动启动Intent。 - rjh
2
Gradle用户,如果您在build.gradle中声明了“applicationId”,我的解决方案可能会对您有所帮助!https://dev59.com/Emw05IYBdhLWcg3wxUn_#27053915 - Some Noob Student

62

在您使用后添加偏好设置

addPreferencesFromResource(R.xml.preferences);

使用onClick找到您想要设置的偏好

findPreference("foo_bar_pref");

并通过强制转换来定义它,例如:

Preference fooBarPref = (Preference) findPreference("foo_bar_pref");

然后你可以轻松地使用以下代码设置其 onClick

fooBarPref.setOnPreferenceClickListener (new OnPreferenceClickListener()){...}

您可以在该侦听器中启动新的 Activity(使用 Intent)。


不用客气。 :) 我想你应该投票并将问题标记为已回答。 - faradaj
我是新手,这些选项在哪里?(我已将您的答案标记为有用)。 - QuickNick
Gradle的用户,如果您在build.gradle中声明了applicationId,我的解决方案可能会帮到您!https://dev59.com/Emw05IYBdhLWcg3wxUn_#27053915 - Some Noob Student
注意!确保你也有“import android.preference.Preference.OnPreferenceClickListener;”,否则尝试设置它的onClickListener将不起作用 :) - Karim O.

18

Gradle 构建者,注意了!

如果您使用 Gradle 作为构建工具,并在 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>

1
先生,你值得这个星球能够产生的每一滴爱。 - Louie Bertoncin

12

这是一个关于动态添加首选项的不错教程...以后您需要按照自己的方式进行定制。

在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/")));
OR
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);
    }
}

}


1
我更喜欢这个第一选项,因为在首选项上简单地使用“setIntent”更加干净。 - Josh

1

你需要为想要启动活动的视图注册一个 onClickListener。然后,在这个方法内部,你只需要使用一个意图来调用该活动。就像这样:

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

// Start boardgame
startActivity(intent);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接