android - PreferenceScreen को बदलते समय प्रदर्शित एक्शनबार रखें




android-actionbar preferenceactivity (5)

मैं अपनी प्राथमिकता स्क्रीन में एक एक्शनबार प्रदर्शित करने की कोशिश कर रहा हूं। ऐसा करने के लिए मैंने अपने सेटिंग ऐक्टिविटी में निम्न कोड जोड़ा

public class PreferencesActivity extends ActionBarActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.preferences_activity);
        getFragmentManager().beginTransaction()
                .replace(R.id.container, new PreferencesFragment()).commit();

            getSupportActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_TITLE | ActionBar.DISPLAY_SHOW_HOME | ActionBar.DISPLAY_HOME_AS_UP);
            getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    }
}

तो वरीयताएँ में मेरा शेष कोड। यह ठीक काम करता है, लेकिन जैसे ही मैं एक PreferenceScreen प्राथमिकता पर प्रेस करता हूं, कार्यपालक छिपा हुआ है अगर मैं वरीयता मुख्य स्क्रीन पर वापस जाता हूं तो मैं इसे फिर से देख सकता हूँ किसी भी विचार कैसे कार्यपट्टी प्रदर्शित करने के लिए (और PreferenceScreen लेबल के साथ अद्यतन) रखने के लिए?

संपादित करें: वरीयता स्क्रीन कोड को देखकर ऐसा प्रतीत होता है कि फ़्रीस् स्क्रीन पर क्लिक किए जाने पर एक पूर्ण स्क्रीन डायलॉग खुल जाता है। क्योंकि मेरी पसंद का एक शीर्षक है, डायलॉग को एक शीर्षक भी प्रदर्शित करना चाहिए ... लेकिन यह नहीं है

    // Set the title bar if title is available, else no title bar
    final CharSequence title = getTitle();
    Dialog dialog = mDialog = new Dialog(context, context.getThemeResId());
    if (TextUtils.isEmpty(title)) {
        dialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE);
    } else {
        dialog.setTitle(title);
    }

मैंने एक एप बना दिया है जिसकी प्राथमिकता गतिविधि में एक्शन बार होता है। मुझे ऐसा करने की चाबी देखने में नहीं आती, हालांकि मुझे याद है कि मुझे इसे ठीक करने के लिए कुछ वक्त लगा।

ऐसा लगता है कि हमारे कोड काफी समान हैं। केवल एक चीज जो मेरा ध्यान आकर्षित करती है वह यह आयात होती है: import android.support.v7.app.ActionBarActivity;

मुझे बताएं कि क्या यह किसी भी मदद करता है

public class SettingsActivity extends ActionBarActivity {


    @Override
    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        getFragmentManager().beginTransaction().replace(android.R.id.content, new PrefsFragment() ).commit();
    } // End of onCreate



    static public class PrefsFragment extends PreferenceFragment {

        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);

            addPreferencesFromResource(R.xml.preferences);  // Load the preferences from an XML resource


        }

    }  // end of PrefsFragment

}

जोड़: क्या आपके पास ये शैलियों में है। Xml?

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
</style>

लेकिन जैसे ही मैं एक PreferenceScreen प्राथमिकता पर प्रेस करता हूं, कार्रवाईबार छिपा होता है अगर मैं वरीयता मुख्य स्क्रीन पर वापस जाता हूं तो मैं इसे फिर से देख सकता हूँ

मुझे लगता है कि आप प्राथमिकता पर क्लिक करते समय एक नई गतिविधि शुरू कर रहे हैं

आपका पसंदीदा टुकड़ा इस तरह दिखना चाहिए

    public static class PreferencesFragment extends PreferenceFragment {

    public PlaceholderFragment() {
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.your_preferences);
    }
}

फिर अपने_preferences का नमूना नीचे दें

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="fill_parent"
android:layout_width="fill_parent" >

<PreferenceCategory
    android:title="@string/pref_category_title">
    <PreferenceScreen
        android:title="@string/title"
        android:summary="@string/summary">

        <intent
            android:targetClass="com.your.package.Youractivity "
            android:targetPackage="com.your.package"/>

    </PreferenceScreen>
    <PreferenceScreen
        android:title="@string/another_title">
        <intent
            android:targetClass="com.your.package.activity2"
            android:targetPackage="com.your.package.activity"/>
    </PreferenceScreen>
</PreferenceCategory>

और आखिरकार, मुख्य चीज़ आक्ट्रेक्टिविटी को एक्शनबाराएक्टिवटी से विस्तारित किया जाना चाहिए

    public class Youractivity extends ActionBarActivity {
}

उपरोक्त कोड मेरे लिए काम करता है


एक ही मुद्दा था नेस्टेड वरीज़ स्क्रीन पर एक्शनबार नहीं था कोड के माध्यम से कदम रखने के बाद, यह AppCompatActivity और PreferenceScreen बीच एक संघर्ष के कारण होता है

एक ओर AppCompatActivity अपने स्वयं के एक्शन बार प्रदान करता है, और इसलिए थीम से उतरते विषय की आवश्यकता है। windowNoTitle = true जो windowNoTitle = true निर्दिष्ट करता है windowNoTitle = true कहीं (जहां बिल्कुल सही नहीं है)। दूसरे पर - dialogTheme गतिविधि विषय (बजाय उप-थीम, जैसे, dialogTheme ) के साथ मंच Dialog का उपयोग करता है। एक बग हो सकता है

यदि आप Theme.AppCompat बारे में परवाह नहीं करते हैं। Theme.AppCompat , यहां एक सरल उपाय है जो API 21+ पर काम करता है:

  • android.preference.PreferenceActivity उपयोग android.preference.PreferenceActivity अपनी गतिविधि के लिए बेस क्लास के रूप में android.preference.PreferenceActivity
  • उस गतिविधि के लिए एक विषय बनाएं:

    <!-- This theme is used to show ActionBar on sub-PreferenceScreens -->
    <style name="PreferenceTheme" parent="">
      <item name="android:windowActionBar">true</item>
      <item name="android:windowNoTitle">false</item>
    </style>
  • AndroidManifest.xml में इस गतिविधि के लिए android:theme="@style/PreferenceTheme" निर्दिष्ट करें

क्या आपको मिलेगा एक पूर्ण ऐक्शनबार से एक मानक विंडो शीर्षक की तरह मैंने अभी तक यह नहीं सोचा है कि काम करने वाले वापस बटन आदि कैसे जोड़ें।

यदि आप AppCompatActivity और संबंधित विषयों के साथ संगत रहना चाहते हैं, तो आपको गतिविधि विंडो पर FEATURE_NO_TITLE का अनुरोध करना होगा। अन्यथा, आप शीर्ष-स्तरीय PreferenceScreen स्क्रीन में दो एक्शन सलाखों (शीर्ष पर निर्मित अंतर्निहित और नीचे का समर्थन) के साथ समाप्त होंगे।


चूंकि गूगल ने अभी तक इसे तय नहीं किया है, वास्तव में एक बहुत आसान समाधान है:

  1. बस "गतिविधि" से विस्तार करने के लिए अपनी सेटिंग्स सक्रियता कक्षा सेट करें

    public class SettingsActivity extends Activity { ...

  2. अपने सेटिंग्सएक्टिवटी के लिए अपने v21 / शैलियां फ़ोल्डर में एक नया थीम बनाएं और माता-पिता को "थीम। सामग्री। *" पर सेट करें

    <style name="CustomThemeSettings" parent="android:Theme.Material"> <item name="android:colorPrimary">@color/...</item> <item name="android:colorPrimaryDark">@color/...</item> <item name="android:colorAccent">@color/...</item> </style>

  3. अपनी Manifest.xml फ़ाइल में अपनी नई थीम सेट करें:

    <activity android:name=".SettingsActivity" android:label="@string/title_activity_settingsactivity" android:theme="@style/CustomThemeSettings" > </activity>

  4. यह सिर्फ काम करता है :)

  5. (वैकल्पिक) यदि आप पुराने डिवाइसों के लिए सामग्री डिज़ाइन समर्थन प्रदान करना चाहते हैं
    आप settingsActivity को एक v21 + फ़ोल्डर में रख सकते हैं और पुराने डिवाइसों के लिए अन्य सेटिंग्सएक्टिविटी बना सकते हैं, जिनके पास माता पिता AppCompat है।


नोट: केवल एपीआई> = 14 के लिए

स्रोत 1 और स्रोत 2

PreferenceActivity1.java

public class PreferenceActivity1 extends android.preference.PreferenceActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    addPreferencesFromResource(R.xml.pref1);

}

@Override
protected void onPostCreate(Bundle savedInstanceState) {
    super.onPostCreate(savedInstanceState);

    LinearLayout root = (LinearLayout)findViewById(android.R.id.list).getParent().getParent().getParent();
    Toolbar bar = (Toolbar) LayoutInflater.from(this).inflate(R.layout.settings_toolbar, root, false);
    root.addView(bar, 0); // insert at top
    bar.setNavigationOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            finish();
        }
    });
}
}

PreferenceActivity2.java

public class PreferenceActivity2 extends android.preference.PreferenceActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    addPreferencesFromResource(R.xml.pref2);
}
@Override
protected void onPostCreate(Bundle savedInstanceState) {
    super.onPostCreate(savedInstanceState);

    LinearLayout root = (LinearLayout)findViewById(android.R.id.list).getParent().getParent().getParent();
    Toolbar bar = (Toolbar) LayoutInflater.from(this).inflate(R.layout.settings_toolbar, root, false);
    root.addView(bar, 0); // insert at top
    bar.setNavigationOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            finish();
        }
    });
}
}

settings_toolbar.xml (लेआउट)

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.Toolbar
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/toolbar"
app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="?attr/actionBarSize"
app:navigationContentDescription="@string/abc_action_bar_up_description"
android:background="?attr/colorPrimary"
app:navigationIcon="?attr/homeAsUpIndicator"
app:title="@string/app_name"
/>

pref1.xml (xml)

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
android:theme="@android:style/Theme.Light" >

<PreferenceCategory android:title="Main Preferences" >
    <CheckBoxPreference
        android:key="wifi enabled"
        android:title="WiFi" />
</PreferenceCategory>

<PreferenceScreen
    android:key="key1"
    android:summary=""
    android:title="Wifi Settings" >
    <intent
        android:action="android.intent.action.VIEW"
        android:targetClass="com.example.PreferenceActivity2"
        android:targetPackage="com.example" />
</PreferenceScreen>

</PreferenceScreen>

pref2.xml (xml)

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
android:theme="@android:style/Theme.Light" >

<PreferenceCategory android:title="Wifi Settings" >
    <CheckBoxPreference
        android:key="prefer wifi"
        android:title="Prefer WiFi" />
</PreferenceCategory>

</PreferenceScreen>

प्रकट

<application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name" >
    <activity
        android:name="com.example.PreferenceActivity1"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity
        android:name="com.example.PreferenceActivity2"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </activity>
</application>

परिणाम





preferencefragment