32

美好的一天,朋友。 我有一個PreferenceActivity,它是從XML文件填充的。 當我們按下一個項目時,我們應該啓動新的活動。怎麼做?我應該在XML文件或Java類中編寫什麼內容?從PreferenceActivity推出新活動

回答

59

後您使用

addPreferencesFromResource(R.xml.preferences); 

找到您要使用

findPreference("foo_bar_pref"); 

設置的onClick和鑄像

Preference fooBarPref = (Preference) findPreference("foo_bar_pref"); 
定義它自己的喜好添加的喜好

然後喲u能方便地使用

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

你可以開始你的新活動(使用一個Intent),該監聽器裏設置它的onClick。

+0

謝謝,非常有用的答案! – QuickNick

+0

歡迎您。 :)我想你應該投票並檢查問題的答案。 – faradaj

+0

我是新手,這些選項在哪裏? (我檢查你的答案是有用的)。 – QuickNick

0

您必須將onClickListener註冊到要啓動活動的視圖。然後,在這個方法中,你只需要用一個intent來調用這個活動。事情是這樣的:

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

// Start boardgame 
startActivity(intent); 
+0

這是初級,但無論如何感謝! :) – QuickNick

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

68

考慮使用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> 
+19

對於那些在嘗試在首選項中啓動其活動後獲得'ActivityNotFoundException'的人,您可能會不恰當地使用子包名稱,就像我正在做的那樣。 如果是這種情況,請僅使用targetClass部分中的子包。 '<意圖機器人:行動= 「android.intent.action.VIEW」 機器人:targetPackage = 「com.package.name」 機器人:targetClass = 「com.package.name.subpackage.ActivityName」/>' – Andrew

+0

要也許可以節省一些人的痛苦:您可以在的XML標籤中定義類別和額外數據,但是您不能使用XML設置意圖標誌。如果你想設置標誌,你需要註冊一個OnPreferenceClickListener並手動啓動Intent。 – rjh

+1

Gradle用戶,如果你在build.gradle中聲明瞭'applicationId',我的解決方案可能會幫助你! http://stackoverflow.com/a/27053915/499125 –

12

Gradle Builders,Look Over Here!

如果您使用gradle over ant作爲構建工具,並且您在android內聲明瞭applicationId

[build.gradle]: 

android { 
    defaultConfig { 
     ... 
     applicationId "com.overriding.package.name" 
    } 
    ... 
} 

這將覆蓋任何價值,你在AndroidManifest.xmlandroid: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> 
+0

你,先生,值得每升這個星球能夠產生的愛。 –

+1

然後我需要很多罐來填充。 –