समर्थन (v21) टूलबार के साथ एक वरीयता स्क्रीन बनाना


116

मुझे एक वरीयता स्क्रीन पर समर्थन लाइब्रेरी में नए मटीरियल डिज़ाइन टूलबार का उपयोग करने में समस्या हो रही थी।

मेरे पास नीचे के रूप में एक settings.xml फ़ाइल है:

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
    <PreferenceCategory
        android:title="@string/AddingItems"
        android:key="pref_key_storage_settings">

        <ListPreference
            android:key="pref_key_new_items"
            android:title="@string/LocationOfNewItems"
            android:summary="@string/LocationOfNewItemsSummary"
            android:entries="@array/new_items_entry"
            android:entryValues="@array/new_item_entry_value"
            android:defaultValue="1"/>

    </PreferenceCategory>
</PreferenceScreen>

तार कहीं और परिभाषित किए गए हैं।


stackoverflow.com/a/27455363/2247612 यह जवाब सपोर्ट लाइब्रेरी के लिए एक सही समाधान है
harishannam

जवाबों:


110

कृपया GitHub रेपो: यहां देखें


पार्टी के लिए थोड़ा देर से, लेकिन यह मेरा समाधान है जिसे मैं एक काम के रूप में उपयोग करना जारी रख रहा हूं PreferenceActivity:

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/action_settings"
    />

SettingsActivity.java :

public class SettingsActivity extends PreferenceActivity {

    @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();
            }
        });
    }

}

Result :

उदाहरण


अद्यतन (जिंजरब्रेड संगतता):

टिप्पणियों के अनुसार, जिंजरब्रेड डिवाइस इस लाइन पर NullPointerException वापस कर रहे हैं:

LinearLayout root = (LinearLayout)findViewById(android.R.id.list).getParent().getParent().getParent();

ठीक कर:

SettingsActivity.java :

public class SettingsActivity extends PreferenceActivity {

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

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
            LinearLayout root = (LinearLayout) findViewById(android.R.id.list).getParent().getParent().getParent();
            bar = (Toolbar) LayoutInflater.from(this).inflate(R.layout.settings_toolbar, root, false);
            root.addView(bar, 0); // insert at top
        } else {
            ViewGroup root = (ViewGroup) findViewById(android.R.id.content);
            ListView content = (ListView) root.getChildAt(0);

            root.removeAllViews();

            bar = (Toolbar) LayoutInflater.from(this).inflate(R.layout.settings_toolbar, root, false);
            

            int height;
            TypedValue tv = new TypedValue();
            if (getTheme().resolveAttribute(R.attr.actionBarSize, tv, true)) {
                height = TypedValue.complexToDimensionPixelSize(tv.data, getResources().getDisplayMetrics());
            }else{
                height = bar.getHeight();
            }

            content.setPadding(0, height, 0, 0);

            root.addView(content);
            root.addView(bar);
        }

        bar.setNavigationOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                finish();
            }
        });
    }
}

ऊपर के साथ किसी भी मुद्दे मुझे पता है!


अद्यतन 2: टंकण कार्य

जैसा कि कई देव नोटों में बताया गया है कि PreferenceActivityतत्वों की टिनिंग का समर्थन नहीं करता है, हालांकि कुछ आंतरिक वर्गों का उपयोग करके आप इसे प्राप्त कर सकते हैं। यह तब तक है जब तक इन वर्गों को हटा नहीं दिया जाता। (AppCompat support-v7 v21.0.3 का उपयोग कर काम करता है)।

निम्नलिखित आयात जोड़ें:

import android.support.v7.internal.widget.TintCheckBox;
import android.support.v7.internal.widget.TintCheckedTextView;
import android.support.v7.internal.widget.TintEditText;
import android.support.v7.internal.widget.TintRadioButton;
import android.support.v7.internal.widget.TintSpinner;

फिर onCreateViewविधि को ओवरराइड करें :

@Override
public View onCreateView(String name, Context context, AttributeSet attrs) {
    // Allow super to try and create a view first
    final View result = super.onCreateView(name, context, attrs);
    if (result != null) {
        return result;
    }

    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
        // If we're running pre-L, we need to 'inject' our tint aware Views in place of the
        // standard framework versions
        switch (name) {
            case "EditText":
                return new TintEditText(this, attrs);
            case "Spinner":
                return new TintSpinner(this, attrs);
            case "CheckBox":
                return new TintCheckBox(this, attrs);
            case "RadioButton":
                return new TintRadioButton(this, attrs);
            case "CheckedTextView":
                return new TintCheckedTextView(this, attrs);
        }
    }

    return null;
}

Result:

उदाहरण 2


AppCompat 22.1

AppCompat 22.1 ने नए रंग वाले तत्व पेश किए, जिसका अर्थ है कि अंतिम अद्यतन के समान प्रभाव प्राप्त करने के लिए आंतरिक कक्षाओं का उपयोग करने की आवश्यकता नहीं है। इसके बजाय इसका पालन करें (अभी भी ओवरराइड कर रहे हैं onCreateView):

@Override
public View onCreateView(String name, Context context, AttributeSet attrs) {
    // Allow super to try and create a view first
    final View result = super.onCreateView(name, context, attrs);
    if (result != null) {
        return result;
    }

    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
        // If we're running pre-L, we need to 'inject' our tint aware Views in place of the
        // standard framework versions
        switch (name) {
            case "EditText":
                return new AppCompatEditText(this, attrs);
            case "Spinner":
                return new AppCompatSpinner(this, attrs);
            case "CheckBox":
                return new AppCompatCheckBox(this, attrs);
            case "RadioButton":
                return new AppCompatRadioButton(this, attrs);
            case "CheckedTextView":
                return new AppCompatCheckedTextView(this, attrs);
        }
    }

    return null;
}

NESTED PREFERENCE SCREENS

बहुत से लोग एक नेस्टेड में टूलबार सहित मुद्दों का सामना कर रहे हैं <PreferenceScreen />, हालांकि, मुझे एक समाधान मिल गया है !! - बहुत परीक्षण और त्रुटि के बाद!

निम्नलिखित को अपने में जोड़ें SettingsActivity:

@SuppressWarnings("deprecation")
@Override
public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
    super.onPreferenceTreeClick(preferenceScreen, preference);

    // If the user has clicked on a preference screen, set up the screen
    if (preference instanceof PreferenceScreen) {
        setUpNestedScreen((PreferenceScreen) preference);
    }

    return false;
}

public void setUpNestedScreen(PreferenceScreen preferenceScreen) {
    final Dialog dialog = preferenceScreen.getDialog();

    Toolbar bar;

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
        LinearLayout root = (LinearLayout) dialog.findViewById(android.R.id.list).getParent();
        bar = (Toolbar) LayoutInflater.from(this).inflate(R.layout.settings_toolbar, root, false);
        root.addView(bar, 0); // insert at top
    } else {
        ViewGroup root = (ViewGroup) dialog.findViewById(android.R.id.content);
        ListView content = (ListView) root.getChildAt(0);

        root.removeAllViews();

        bar = (Toolbar) LayoutInflater.from(this).inflate(R.layout.settings_toolbar, root, false);

        int height;
        TypedValue tv = new TypedValue();
        if (getTheme().resolveAttribute(R.attr.actionBarSize, tv, true)) {
            height = TypedValue.complexToDimensionPixelSize(tv.data, getResources().getDisplayMetrics());
        }else{
            height = bar.getHeight();
        }

        content.setPadding(0, height, 0, 0);

        root.addView(content);
        root.addView(bar);
    }

    bar.setTitle(preferenceScreen.getTitle());

    bar.setNavigationOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            dialog.dismiss();
        }
    });
}

कारण यह है कि PreferenceScreenइस तरह के एक दर्द है क्योंकि वे एक आवरण संवाद के रूप में आधारित हैं, इसलिए हमें टूलबार को इसमें जोड़ने के लिए संवाद लेआउट पर कब्जा करने की आवश्यकता है।


टूलबार छाया

डिजाइन के द्वारा आयात Toolbarपूर्व -21 उपकरणों में ऊंचाई और छाया देने की अनुमति नहीं देता है, इसलिए यदि आप अपने ऊपर ऊंचाई रखना चाहते हैं तो Toolbarआपको इसे इसमें लपेटने की आवश्यकता है AppBarLayout:

settings_toolbar.xml :

<android.support.design.widget.AppBarLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

   <android.support.v7.widget.Toolbar
       .../>

</android.support.design.widget.AppBarLayout>

build.gradleफ़ाइल में निर्भरता के रूप में डिज़ाइन समर्थन लाइब्रेरी को जोड़ना न भूलें :

compile 'com.android.support:support-v4:22.2.0'
compile 'com.android.support:appcompat-v7:22.2.0'
compile 'com.android.support:design:22.2.0'

Android 6.0

मैंने रिपोर्ट की गई ओवरलैपिंग समस्या की जांच की है और मैं इस मुद्दे को पुन: पेश नहीं कर सकता।

उपरोक्त के रूप में उपयोग में पूर्ण कोड निम्नलिखित उत्पन्न करता है:

यहां छवि विवरण दर्ज करें

अगर मुझे कुछ याद आ रहा है तो कृपया मुझे इस रेपो के माध्यम से बताएं और मैं जांच करूंगा।


यह gingebread में nullpointer को अपवाद देता है, मूल null है ... कोई हल नहीं है?
औरक्लिमैक्स

आपका समाधान महान काम करता है। लेकिन इस दृष्टिकोण के साथ एक समस्या है, बिना ActionBarActivity का विस्तार किए बिना जो कि अनिवार्य है (दस्तावेज़ीकरण से) <5.0 पर सामग्री विषय को प्राप्त करने के लिए, colorAccent (केवल एक उदाहरण बनाने के लिए) उपकरणों के चेकबॉक्स में लागू नहीं होता है - 5.0। यह एक वास्तविक दर्द लगता है..मुझे पसंद की गतिविधि को दूर करना है और वरीयता स्क्रीन को अनुकरण करने के लिए एक रैखिक लेआउट का उपयोग करना है, अन्यथा मुझे एपीआई स्तर 8 से 21 तक के उपकरणों में सामग्री विषय का उपयोग करने का कोई तरीका नहीं दिखता है। वरीयता का टुकड़ा है "केवल"> 11 :(
क्यूलिमैक्स

1
@andQlimax मैंने टिनिंग मुद्दे के समाधान के साथ अपना जवाब अपडेट किया है
डेविड पासमोर

3
मेरे लिए @DavidPassmore वरीयता सूची टूलबार पर ओवरलैप कर रही है
शशांक श्रीवास्तव

1
@ शशांक श्रीवास्तव यह दर्शाते हैं कि यदि आप एंड्रॉइड 6 का उपयोग कर रहे हैं, तो मैं इसके लिए एक समाधान पर काम कर रहा हूं। अद्यतन के लिए धन्यवाद।
डेविड पासमोर

107

आप PreferenceFragmentएक विकल्प के रूप में, एक का उपयोग कर सकते हैं PreferenceActivity। तो, यहाँ रैपिंग Activityउदाहरण है:

public class MyPreferenceActivity extends ActionBarActivity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.pref_with_actionbar);

        android.support.v7.widget.Toolbar toolbar = (android.support.v7.widget.Toolbar) findViewById(uk.japplications.jcommon.R.id.toolbar);
        setSupportActionBar(toolbar);

        getFragmentManager().beginTransaction().replace(R.id.content_frame, new MyPreferenceFragment()).commit();
    }
}

और यहाँ लेआउट फ़ाइल है (pref_with_actionbar):

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_height="@dimen/action_bar_height"
        android:layout_width="match_parent"
        android:minHeight="?attr/actionBarSize"
        android:background="?attr/colorPrimary"
        app:theme="@style/ToolbarTheme.Base"
        app:popupTheme="@style/ThemeOverlay.AppCompat.Light"/>

    <FrameLayout
        android:id="@+id/content_frame"
        android:layout_below="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

</RelativeLayout>

और अंत में PreferenceFragment:

public static class MyPreferenceFragment extends PreferenceFragment{
    @Override
    public void onCreate(final Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.settings);
    }
}

मुझे उम्मीद है इससे किसी को सहायता मिलेगी।


39
मैंने इस दृष्टिकोण की कोशिश की है। समस्या यह है कि यह बच्चे की वरीयता स्क्रीन में टूलबार प्रदर्शित नहीं करता है।
मधुर आहूजा

2
मुझे लगता है कि वह वरीयता वरीयता XML में एम्बेड किए गए वरीयतास्क्रीन के बारे में बात कर रहा है।
लुकास एस।

5
मुझे दृष्टिकोण पसंद आया, लेकिन
उदासीनता

12
यह न तो साथ काम करेगा। व्यावहारिक रूप से, भौतिक रूप से डिज़ाइन किए गए, टूलबार, नेस्टेड वरीयता स्क्रीन बनाने का कोई तरीका प्रतीत नहीं होता है। यदि आप ActionBarActivityटूलबार और संबंधित कार्यों को प्राप्त करने के लिए a का उपयोग onBuildHeaders()करते हैं, तो गतिविधि को ओवरराइड करने के लिए कोई वास्तविक प्राथमिकता समर्थन नहीं होगा। आप पुराने का उपयोग करते हैं PreferenceActivity, तो आप उपकरण पट्टी और संबंधित कार्य (की जरूरत नहीं है हाँ, तुम एक हो सकता है Toolbarऔर लेआउट लेकिन आप कॉल नहीं कर सकते setSupportActionBar()तो, या तो वरीयता हेडर या नेस्टेड वरीयता स्क्रीन के साथ, हम अटक लग रहे
Gábor

1
मैं गाबोर की टिप्पणी से सहमत हूं। यह समाधान सामान्य रूप से काम नहीं करता है। टूलबार का अनुकरण करने के साथ बेहतर एक बंदा है (कोई एक्शनबेर नहीं है, लेकिन कौन परवाह करता है) और बोर्ड पर AppCompatDelegate के साथ जारी नया समर्थन परिवाद भी।
यूजीन वीक्स्लर

48

पूरी तरह से नया अपडेट।

कुछ प्रयोग के साथ, मुझे लगता है कि नेस्टेड प्रेफरेंस स्क्रीन के लिए काम करने वाला AppCompat 22.1+ समाधान मिल गया है।

सबसे पहले, जैसा कि यह कई उत्तरों में वर्णित है (यहां एक सहित), आपको नए का उपयोग करने की आवश्यकता होगी AppCompatDelegate। या तो का उपयोग AppCompatPreferenceActivity.javaसमर्थन क़ौम से फ़ाइल ( https://android.googlesource.com/platform/development/+/58bf5b99e6132332afb8b44b4c8cedf5756ad464/samples/Support7Demos/src/com/example/android/supportv7/app/AppCompatPreferenceActivity.java ) और बस का विस्तार इससे, या संबंधित कार्यों को अपने में कॉपी करें PreferenceActivity। मैं यहां पहला तरीका दिखाऊंगा:

public class SettingsActivity extends AppCompatPreferenceActivity {

  @Override
  public void onBuildHeaders(List<Header> target) {
    loadHeadersFromResource(R.xml.settings, target);

    setContentView(R.layout.settings_page);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    ActionBar bar = getSupportActionBar();
    bar.setHomeButtonEnabled(true);
    bar.setDisplayHomeAsUpEnabled(true);
    bar.setDisplayShowTitleEnabled(true);
    bar.setHomeAsUpIndicator(R.drawable.abc_ic_ab_back_mtrl_am_alpha);
    bar.setTitle(...);
  }

  @Override
  protected boolean isValidFragment(String fragmentName) {
    return SettingsFragment.class.getName().equals(fragmentName);
  }

  @Override
  public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
      case android.R.id.home:
        onBackPressed();
        break;
    }
    return super.onOptionsItemSelected(item);
  }
}

साथ का लेआउट सरल और सामान्य है ( layout/settings_page.xml):

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_margin="0dp"
    android:orientation="vertical"
    android:padding="0dp">
  <android.support.v7.widget.Toolbar
      android:id="@+id/toolbar"
      android:layout_width="match_parent"
      android:layout_height="?attr/actionBarSize"
      android:background="?attr/colorPrimary"
      android:elevation="4dp"
      android:theme="@style/..."/>
  <ListView
      android:id="@id/android:list"
      android:layout_width="match_parent"
      android:layout_height="match_parent"/>
</LinearLayout>

वरीयताओं को खुद को हमेशा की तरह परिभाषित किया गया है ( xml/settings.xml):

<preference-headers xmlns:android="http://schemas.android.com/apk/res/android">
  <header
      android:fragment="com.example.SettingsFragment"
      android:summary="@string/..."
      android:title="@string/...">
    <extra
        android:name="page"
        android:value="page1"/>
  </header>
  <header
      android:fragment="com.example.SettingsFragment"
      android:summary="@string/..."
      android:title="@string/...">
    <extra
        android:name="page"
        android:value="page2"/>
  </header>
  ...
</preference-headers>

इस बिंदु तक नेट पर समाधान के लिए कोई वास्तविक अंतर नहीं है। वास्तव में, आप इसका उपयोग तब भी कर सकते हैं, जब आपके पास नेस्टेड स्क्रीन नहीं है, कोई हेडर नहीं है, केवल एक स्क्रीन है।

हम PreferenceFragmentसभी गहरे पृष्ठों के लिए एक आम का उपयोग करते हैं , extraहेडर में मापदंडों द्वारा विभेदित है । प्रत्येक पृष्ठ में एक अलग XML एक आम PreferenceScreenअंदर ( xml/settings_page1.xmlएट अल।) के साथ होगी। टुकड़ा टूलबार सहित गतिविधि के समान लेआउट का उपयोग करता है।

public class SettingsFragment extends PreferenceFragment {

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    getActivity().setTheme(R.style...);

    if (getArguments() != null) {
      String page = getArguments().getString("page");
      if (page != null)
        switch (page) {
          case "page1":
            addPreferencesFromResource(R.xml.settings_page1);
            break;
          case "page2":
            addPreferencesFromResource(R.xml.settings_page2);
            break;
          ...
        }
    }
  }

  @Override
  public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View layout = inflater.inflate(R.layout.settings_page, container, false);
    if (layout != null) {
      AppCompatPreferenceActivity activity = (AppCompatPreferenceActivity) getActivity();
      Toolbar toolbar = (Toolbar) layout.findViewById(R.id.toolbar);
      activity.setSupportActionBar(toolbar);

      ActionBar bar = activity.getSupportActionBar();
      bar.setHomeButtonEnabled(true);
      bar.setDisplayHomeAsUpEnabled(true);
      bar.setDisplayShowTitleEnabled(true);
      bar.setHomeAsUpIndicator(R.drawable.abc_ic_ab_back_mtrl_am_alpha);
      bar.setTitle(getPreferenceScreen().getTitle());
    }
    return layout;
  }

  @Override
  public void onResume() {
    super.onResume();

    if (getView() != null) {
      View frame = (View) getView().getParent();
      if (frame != null)
        frame.setPadding(0, 0, 0, 0);
    }
  }
}

अंत में, यह वास्तव में कैसे काम करता है, इसका एक त्वरित सारांश। नया AppCompatDelegateहमें AppCompat सुविधाओं के साथ किसी भी गतिविधि का उपयोग करने की अनुमति देता है, न केवल उन गतिविधियों से जो वास्तव में AppCompat में फैली हुई हैं। इसका मतलब है कि हम अच्छे पुराने PreferenceActivityको एक नए में बदल सकते हैं और हमेशा की तरह टूलबार जोड़ सकते हैं। उस बिंदु से, हम मौजूदा दस्तावेज़ों से किसी भी विचलन के बिना वरीयता स्क्रीन और हेडर के बारे में पुराने समाधानों से चिपके रह सकते हैं। बस एक महत्वपूर्ण बिंदु है: onCreate()गतिविधि में उपयोग न करें क्योंकि यह त्रुटियों को जन्म देगा। onBuildHeaders()टूलबार जोड़ने जैसे सभी कार्यों के लिए उपयोग करें ।

केवल वास्तविक अंतर है, और यह है कि यह नेस्टेड स्क्रीन के साथ काम करता है कि आप टुकड़ों के साथ एक ही दृष्टिकोण का उपयोग कर सकते हैं। आप onCreateView()उसी तरह का उपयोग कर सकते हैं , सिस्टम एक के बजाय अपने स्वयं के लेआउट को फुलाते हुए, टूलबार को गतिविधि में उसी तरह जोड़ते हैं।


2
क्या एक महान सा काम! यह एकमात्र समाधान है जो मैंने पाया है जो एक वंशज वरीयतास्क्रीन पर सामग्री टूलबार दिखाएगा। शाबाश सर।
स्ट्रिंग

मैं अप-आइकन के लिए ऐप्पोकोम लाइब्रेरी से संसाधन का उपयोग करता हूं:R.drawable.abc_ic_ab_back_mtrl_am_alpha
Ridcully

इस समाधान के साथ, मुझे लगता है कि टूलबार सामग्री को सही से स्क्रॉल करेगा? क्योंकि यह आंतरिक ListView में सिर्फ एक आइटम है।
तस्मानी जूल

इस अद्यतन के साथ नहीं, नया समाधान। जो उम्मीद के मुताबिक काम करता है।
गैबोर

अजीब बात है, इस समाधान के PreferenceFragmentCompatबजाय पहचान करने के लिए प्रतीत नहीं होता है PreferenceFragment। किसी नए प्रीफ़्स स्क्रीन को लोड नहीं करने के बजाय उसके preference-headerसाथ xmlns:app="http://schemas.android.com/apk/res-auto" और फिर सेट अप करना । तो मुद्दों w / पीछे संगतता ... सुझाव? app:fragmentandroid:fragment
23

18

यदि आप पसंदहेडर्स का उपयोग करना चाहते हैं, तो आप निम्नलिखित दृष्टिकोण का उपयोग कर सकते हैं:

import android.support.v7.widget.Toolbar;

public class MyPreferenceActivity extends PreferenceActivity

   Toolbar mToolbar;

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

        ViewGroup root = (ViewGroup) findViewById(android.R.id.content);
        LinearLayout content = (LinearLayout) root.getChildAt(0);
        LinearLayout toolbarContainer = (LinearLayout) View.inflate(this, R.layout.activity_settings, null);

        root.removeAllViews();
        toolbarContainer.addView(content);
        root.addView(toolbarContainer);

        mToolbar = (Toolbar) toolbarContainer.findViewById(R.id.toolbar);
    }

    @Override
    public void onBuildHeaders(List<Header> target) {
        loadHeadersFromResource(R.xml.pref_headers, target);
    }

    // Other methods

}

लेआउट / activity_settings.xml

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_height="?attr/actionBarSize"
        android:layout_width="match_parent"
        android:minHeight="?attr/actionBarSize"
        android:background="?attr/colorPrimary"
        app:theme="@style/AppTheme"
        app:popupTheme="@style/ThemeOverlay.AppCompat.Light"/>

</LinearLayout>

आप यहां जो भी लेआउट पसंद करते हैं उसका उपयोग कर सकते हैं, बस यह सुनिश्चित करें कि आप इसे जावा कोड में भी समायोजित कर सकते हैं।

और अंत में, हेडर (xml / pref_headers.xml) के साथ आपकी फ़ाइल

<preference-headers xmlns:android="http://schemas.android.com/apk/res/android">

    <header
        android:fragment="com.example.FirstFragment"
        android:title="@string/pref_header_first" />
    <header
        android:fragment="com.example.SecondFragment"
        android:title="@string/pref_header_second" />

</preference-headers>

root.addView (उपकरण पट्टी); क्यों? root.addView (toolbarContainer);
क्रॉसले सांग

वूप्स, नाम बदलने के दौरान एक चर याद किया, यह तय किया।
स्वेन डबल्ड

1
बहुत बढ़िया जवाब। यहाँ कुंजी यह है कि android.R.id.contentविचार करते हुए, हम वरीयता सूची के लिए एक ListViewसाथ पास करते थे android.R.id.list(और फिर भी अगर खंड-कम, शीर्षकहीन, तरीका) का उपयोग करते हैं।
davidcsb

2
मुझे लगता है कि एंड्रॉइड के कोड की जांच करना बेहतर है, यह देखने के लिए कि इसकी ज़रूरत क्या है, इसके बजाय अपने विचारों के साथ गड़बड़ करने के बजाय हिचकी (इसे देखें / हटाएं)। मुझे लगता है कि यह इस तरह से सुरक्षित है। मेरा सुझाव है कि "वरीयता_सूची_कंटेंट" फ़ाइल की जाँच करें।
एंड्रॉयड डेवलपर

2
यह इस धागे में सबसे अच्छा जवाब है। इस लेख के लेखक ने इसे पूर्ण संदर्भ कार्यान्वयन के लिए विस्तारित किया, जिसका मैंने उपयोग किया। वास्तव में, यह आपके ऐप में परिष्कृत प्राथमिकताओं का समर्थन करने के लिए एकमात्र कार्यशील समाधान है।
यूजीन वीक्स्लर

17

एंड्रॉइड सपोर्ट लाइब्रेरी 22.1.0 और नए AppCompatDelegate की रिलीज़ के साथ, यहां आप बैकवर्ड संगतता के साथ सामग्री समर्थन के साथ वरीयता के कार्यान्वयन का एक अच्छा नमूना पा सकते हैं।

अपडेट यह नेस्टेड स्क्रीन पर भी काम करता है।

https://android.googlesource.com/platform/development/+/marshmallow-mr3-release/samples/Support7Demos/src/com/example/android/supportv7/app/AppCompatPreferenceActivity.java


1
ओह, यह बहुत अच्छी खबर है! इसलिए ऐसा प्रतीत होता है कि इस नए परिप्रेक्ष्य में "एक्शन बैक्टिविटी" के आधार पर समाधान "एक्शनबार्क्टिविटी को बढ़ाएं" से बेहतर हैं।
यूजीन वीक्स्लर

1
@EugeneWechsler हाँ, वास्तव में, ActionBarActivity को अब हटा दिया गया है।
MrBrightside

इस समाधान को नेस्टेड स्क्रीन पर भी काम करें? क्या कोई बेहतर उदाहरण है?
टॉमस

@ टॉमास मैंने अभी तक कोशिश नहीं की है, लेकिन इसे नेस्टेड स्क्रीन पर भी काम करना चाहिए। यदि आपके लिए काम करता है, तो कृपया हमें बताएं।
श्रीब्राइटसाइड

आपका बहुत बहुत धन्यवाद ! गैलेक्सी नेक्सस (4.3) और नेस्टेड स्क्रीन (लॉलीपॉप) के साथ एमुलेटर पर मेरे लिए काम करना।
टिम ऑटिन

6

यद्यपि उपरोक्त उत्तर विस्तृत प्रतीत होते हैं, यदि आप चाहते हैं कि टूलबार का उपयोग एपीआई 7 के साथ किया जाए और विस्तार करते समय सभी ठीक हो जाएं PreferenceActivity, तो मुझे इस परियोजना से मदद मिली।

https://github.com/AndroidDeveloperLB/ActionBarPreferenceActivity

activity_settings.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >

<android.support.v7.widget.Toolbar
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@color/app_theme_light"
    app:popupTheme="@style/Theme.AppCompat.Light"
    app:theme="@style/Theme.AppCompat" />

<FrameLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="@dimen/padding_medium" >

    <ListView
        android:id="@android:id/list"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</FrameLayout>

SettingsActivity.java

public class SettingsActivity extends PreferenceActivity {

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

    setContentView(R.layout.activity_settings);

    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);

    addPreferencesFromResource(R.xml.preferences);

    toolbar.setClickable(true);
    toolbar.setNavigationIcon(getResIdFromAttribute(this, R.attr.homeAsUpIndicator));
    toolbar.setTitle(R.string.menu_settings);
    toolbar.setNavigationOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            finish();
        }
    });

}

private static int getResIdFromAttribute(final Activity activity, final int attr) {
    if (attr == 0) {
        return 0;
    }
    final TypedValue typedvalueattr = new TypedValue();
    activity.getTheme().resolveAttribute(attr, typedvalueattr, true);
    return typedvalueattr.resourceId;
}
}

6

मैं भी AppCompatPreferenceActivity के लिए v7 सपोर्ट टूलबार ( API 25 ) को जोड़ने के लिए एक समाधान की तलाश में हूं (जो कि SettingsActivity जोड़ते समय AndroidStudio द्वारा स्वचालित रूप से बनाया गया है)। कई समाधानों को पढ़ने और उनमें से प्रत्येक को आज़माने के बाद, मैंने एक टूलबार के साथ प्रदर्शित करने के लिए उत्पन्न वरीयताफ्रेम उदाहरण प्राप्त करने के लिए संघर्ष किया।

एक संशोधित समाधान जो काम करता था " गैबोर " से था ।

मेरे द्वारा सामना किए गए कैविएट्स में से एक 'ऑनबिल्डहेडर्स' केवल एक बार आग था। यदि आप एक डिवाइस (एक फोन की तरह) को बग़ल में मोड़ते हैं, तो दृश्य फिर से आ जाता है और वरीयता को बिना टूलबार के छोड़ दिया जाता है, हालांकि वरीयताएँ अपनी बनाए रखेंगे।

मैंने 'onPostCreate' का उपयोग करके 'setContentView' का उपयोग करने की कोशिश की, जबकि इसने टूलबार को फिर से बनाने के लिए काम किया जब अभिविन्यास बदल गया, तब वरीयता-वर्णनों को फिर से खाली कर दिया जाएगा।

मैं हर टिप के बारे में सिर्फ और सिर्फ इस विषय के बारे में पढ़ सकता हूं। मुझे आशा है कि अन्य इसे भी उपयोगी पाएंगे।

हम जावा से शुरू करेंगे

सबसे पहले (था) के अनुसार AppCompatPreferenceActivity.java मैं 'setSupportActionBar' संशोधित कर दिया की तरह:

public void setSupportActionBar(@Nullable Toolbar toolbar) {
    getDelegate().setSupportActionBar(toolbar);
    ActionBar bar = getDelegate().getSupportActionBar();
    bar.setHomeButtonEnabled(true);
    bar.setDisplayHomeAsUpEnabled(true);
}

दूसरा , मैंने AppCompatPreferenceFragment.java नाम से एक नया वर्ग बनाया (यह एक अप्रयुक्त नाम है, हालांकि यह इस तरह नहीं रह सकता है!)।

abstract class AppCompatPreferenceFragment extends PreferenceFragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.activity_settings, container, false);
        if (view != null) {
            Toolbar toolbar = (Toolbar) view.findViewById(R.id.toolbar_settings);
            ((AppCompatPreferenceActivity) getActivity()).setSupportActionBar(toolbar);
        }
        return view;
    }

    @Override
    public void onResume() {
        super.onResume();
        View frame = (View) getView().getParent();
        if (frame != null) frame.setPadding(0, 0, 0, 0);
    }
}

यह गैबर के जवाब का हिस्सा है जिसने काम किया।

अंतिम , स्थिरता प्राप्त करने के लिए हमें SettingsActivity.java में कुछ बदलाव करने की आवश्यकता है :

public class SettingsActivity extends AppCompatPreferenceActivity {

    boolean mAttachedFragment;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        mAttachedFragment = false;
        super.onCreate(savedInstanceState);
    }

    @Override
    @TargetApi(Build.VERSION_CODES.HONEYCOMB)
    public void onBuildHeaders(List<Header> target) {
        loadHeadersFromResource(R.xml.pref_headers, target);
    }

    @Override
    public void onAttachFragment(Fragment fragment) {
        mAttachedFragment = true;
        super.onAttachFragment(fragment);
    }

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

        //if we didn't attach a fragment, go ahead and apply the layout
        if (!mAttachedFragment) {
            setContentView(R.layout.activity_settings);
            setSupportActionBar((Toolbar)findViewById(R.id.toolbar_settings));
        }
    }

    /**
     * This fragment shows general preferences only. It is used when the
     * activity is showing a two-pane settings UI.
     */
    @TargetApi(Build.VERSION_CODES.HONEYCOMB)
    public static class GeneralPreferenceFragment extends AppCompatPreferenceFragment {
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);

            addPreferencesFromResource(R.xml.pref_general);
            setHasOptionsMenu(true);

            bindPreferenceSummaryToValue(findPreference("example_text"));
            bindPreferenceSummaryToValue(findPreference("example_list"));
        }

        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
            int id = item.getItemId();
            if (id == android.R.id.home) {
                startActivity(new Intent(getActivity(), SettingsActivity.class));
                return true;
            }
            return super.onOptionsItemSelected(item);
        }
    }
}

कुछ कोड संक्षिप्तता के लिए गतिविधि से बाहर छोड़ दिया गया है। यहां प्रमुख घटक 'हैं onAttachedFragment ', ' onPostCreate ', और कहा कि 'GeneralPreferenceFragment' अब कस्टम 'फैली हुई है AppCompatPreferenceFragment PreferenceFragment के बजाय'।

कोड सारांश : यदि एक टुकड़ा मौजूद है, तो टुकड़ा नए लेआउट को इंजेक्ट करता है और संशोधित 'सेटसुपोर्टएशनबेशन' फ़ंक्शन को कॉल करता है। यदि टुकड़ा मौजूद नहीं है, तो SettingsActivity 'onPostCreate' पर नया लेआउट इंजेक्ट करता है

अब XML पर (बहुत सरल):

activity_settings.xml :

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <include
        layout="@layout/app_bar_settings"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</LinearLayout>

app_bar_settings.xml :

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/content_frame"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    tools:context=".SettingsActivity">

    <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/AppTheme.NoActionBar.AppBarOverlay">

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar_settings"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="?attr/colorPrimary"
            app:popupTheme="@style/AppTheme.NoActionBar.PopupOverlay" />

    </android.support.design.widget.AppBarLayout>

    <include layout="@layout/content_settings" />

</android.support.design.widget.CoordinatorLayout>

content_settings.xml :

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/content"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    tools:context=".SettingsActivity"
    tools:showIn="@layout/app_bar_settings">

    <ListView
        android:id="@android:id/list"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

</RelativeLayout>

अंतिम परिणाम :

SettingsActivity

GeneralPreferenceFragment


होनहार लगता है, लेकिन मेरे लिए काम नहीं करता है। imgur.com/lSSVCIo (पिक्सेल सी एमुलेटर)।
थॉमस वॉस


5

मेरे पास एक नया (संभवत: एनटर) समाधान है, जो AppCompatPreferenceActivityसमर्थन v7 नमूनों से उपयोग करता है । इस कोड को हाथ में लेकर मैंने अपना एक लेआउट बनाया जिसमें एक टूलबार शामिल है:

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent" android:layout_height="match_parent"
    android:fitsSystemWindows="true" tools:context="edu.adelphi.Adelphi.ui.activity.MainActivity">

    <android.support.design.widget.AppBarLayout android:id="@+id/appbar"
        android:layout_width="match_parent" android:layout_height="wrap_content"
        android:theme="@style/AppTheme.AppBarOverlay">

        <android.support.v7.widget.Toolbar android:id="@+id/toolbar"
            android:layout_width="match_parent" android:layout_height="?attr/actionBarSize"
            android:background="?attr/colorPrimary" app:popupTheme="@style/AppTheme.PopupOverlay"/>

    </android.support.design.widget.AppBarLayout>

    <FrameLayout android:id="@+id/content"
        android:layout_width="match_parent" android:layout_height="match_parent"/>

</android.support.design.widget.CoordinatorLayout>

फिर, मेरे में AppCompatPreferenceActivity, मैंने setContentViewअपना नया लेआउट बनाने के लिए बदल दिया , और मेरे अंदर दिए गए लेआउट को जगह दी FrameLayout:

@Override
public void setContentView(@LayoutRes int layoutResID) {
    View view = getLayoutInflater().inflate(R.layout.toolbar, null);
    FrameLayout content = (FrameLayout) view.findViewById(R.id.content);
    getLayoutInflater().inflate(layoutResID, content, true);
    setContentView(view);
}

फिर मैं सिर्फ विस्तार करता हूं AppCompatPreferenceActivity, मुझे setSupportActionBar((Toolbar) findViewById(R.id.toolbar))टूलबार में मेनू आइटम को कॉल करने और फुलाए जाने की अनुमति देता है । एक का लाभ रखते हुए सभी PreferenceActivity


5

बिना किसी इन-बिल्ट लेआउट को तोड़े इसे सरल और स्वच्छ रखें

import android.support.design.widget.AppBarLayout;
import android.support.v4.app.NavUtils;
import android.support.v7.widget.Toolbar;

private void setupActionBar() {
    Toolbar toolbar = new Toolbar(this);

    AppBarLayout appBarLayout = new AppBarLayout(this);
    appBarLayout.addView(toolbar);

    final ViewGroup root = (ViewGroup) findViewById(android.R.id.content);
    final ViewGroup window = (ViewGroup) root.getChildAt(0);
    window.addView(appBarLayout, 0);

    setSupportActionBar(toolbar);

    // Show the Up button in the action bar.
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    toolbar.setNavigationOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            onBackPressed();
        }
    });
}

मेरे लिए काम नहीं किया, root.getChildAt(0);रिटर्न null
Eido95

4

मुझे इस पर काम करते हुए यह सरल समाधान मिला। पहले हमें सेटिंग्स गतिविधि के लिए एक लेआउट बनाने की आवश्यकता है।

activity_settings.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.my.package">

    <android.support.v7.widget.Toolbar
        android:id="@+id/tool_bar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="?attr/colorPrimary"
        android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
        app:elevation="@dimen/appbar_elevation"
        app:navigationIcon="?attr/homeAsUpIndicator"
        app:navigationContentDescription="@string/abc_action_bar_up_description"
        app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />

    <ListView
        android:id="@android:id/list"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/tool_bar" />

</RelativeLayout>

सुनिश्चित करें कि आप के साथ एक सूची दृश्य जोड़ें android:id="@android:id/list", अन्यथा यह फेंक देगाNullPointerException

अगला कदम onCreateअपनी सेटिंग गतिविधि में (ओवरराइड) विधि जोड़ना है

Settings.java

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_settings);
    Toolbar toolbar = (Toolbar) findViewById(R.id.tool_bar);
    toolbar.setTitle(R.string.action_settings);
    toolbar.setNavigationOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            finish();
        }
    });
}

सुनिश्चित करें कि आप आयात करते हैं android.suppoer.v7.widget.Toolbar। यह 16 (जेली बीन और ऊपर) सभी एपीआई पर बहुत अधिक काम करना चाहिए


1

मैं जेम्स क्रॉस के चिह्नित समाधान को जारी रखना चाहूंगा, क्योंकि इसके बाद सेटिंग्सएक्टिविटी को बंद नहीं करने के तरीके में केवल सक्रिय नेस्टेड स्क्रीन (वरीयता) को बंद करने की समस्या है।

वास्तव में यह सभी नेस्टेड स्क्रीन पर काम करता है (इसलिए मैं गैबोर के समाधान को नहीं समझता हूं कि मैंने सफलता के बिना कोशिश की, अच्छी तरह से यह एक निश्चित बिंदु तक काम करता है लेकिन यह कई टूलबार की गड़बड़ी है), क्योंकि जब उपयोगकर्ता एक उप वरीयता स्क्रीन पर क्लिक करता है , केवल टुकड़ा बदल दिया जाता है (देखें <FrameLayout android:id="@+id/content_frame" .../>) टूलबार नहीं है जो हमेशा सक्रिय और दृश्यमान रहता है, लेकिन प्रत्येक टुकड़े को तदनुसार बंद करने के लिए एक कस्टम व्यवहार लागू किया जाना चाहिए।

मुख्य वर्ग में SettingsActivityजो ActionBarActivityनिम्न विधियों का विस्तार करता है , उन्हें लागू किया जाना चाहिए। ध्यान दें कि निजी setupActionBar()कहा जाता हैonCreate()

private void setupActionBar() {
    Toolbar toolbar = (Toolbar)findViewById(R.id.toolbar);
    //Toolbar will now take on default Action Bar characteristics
    setSupportActionBar(toolbar);
    getSupportActionBar().setHomeButtonEnabled(true);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);

}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case android.R.id.home:
        onBackPressed();
        return true;
    }
    return super.onOptionsItemSelected(item);
}

@Override
public void onBackPressed() {
    if (getFragmentManager().getBackStackEntryCount() > 0) {
        getFragmentManager().popBackStackImmediate();
        //If the last fragment was removed then reset the title of main
        // fragment (if so the previous popBackStack made entries = 0).
        if (getFragmentManager().getBackStackEntryCount() == 0) {
            getSupportActionBar()
                .setTitle(R.string.action_settings_title);
        }
    } else {
        super.onBackPressed();
    }
}

चुने हुए नेस्टेड स्क्रीन के शीर्षक के लिए आपको अपने टूलबार का संदर्भ प्राप्त करना चाहिए और toolbar.setTitle(R.string.pref_title_general);(उदाहरण के लिए) उपयुक्त शीर्षक सेट करना चाहिए ।

सभी वरीयता में लागू करने की कोई आवश्यकता नहीं हैgetSupportActionBar() क्योंकि केवल प्रत्येक प्रतिबद्ध पर टुकड़े का दृश्य बदल जाता है, टूलबार नहीं;

प्रत्येक वरीयता में जोड़ने के लिए एक नकली टूलबारप्रेशन क्लास बनाने की कोई आवश्यकता नहीं है। xml (गैबोर का उत्तर देखें)।


1

यहां मैंने एक पुस्तकालय बनाया है जो AOSP कोड पर आधारित है, जो प्राथमिकताओं और संवादों के लिए टिनिंग जोड़ता है, एक एक्शन बार जोड़ता है, और एपीआई 7 से सभी संस्करणों का समर्थन करता है:

https://github.com/AndroidDeveloperLB/MaterialPreferenceLibrary


कोड को देखने से, यह नेस्टेड वरीयताओं के लिए काम नहीं करता है ...?
टिम राए

@TimRae मुझे यकीन नहीं है कि मैंने परीक्षण किया है कि आप किस बारे में बात कर रहे हैं। कृपया इसका मतलब बताएं। परिदृश्य क्या आप वास्तव में उपयोग करने की कोशिश कर रहे हैं?
Android डेवलपर

यदि आप एक है जब PreferenceScreenअंदर एक PreferenceScreenतरह इस
टिम रायबरेली

मैंने कभी इस तरह का प्रयोग नहीं किया। डॉक्स पढ़ना:: developer.android.com/reference/android/preference/… , मुझे लगता है कि यह स्क्रीन के बीच जाने में मदद कर सकता है। आप कहते हैं मुझे भी जोड़ना चाहिए? मैं इसकी जांच करुँगा । धन्यवाद। इसके अलावा, कृपया अगली बार Github का उपयोग ऐसी चीज़ (अनुरोधों और मुद्दों) के लिए करें।
एंड्रॉइड डेवलपर

हाँ, यह उपयोगी है जब आपके पास सिंगल स्क्रीन के लिए बहुत अधिक प्राथमिकताएँ हैं ... इस थ्रेड में पहले से ही कई जगह हैं जहाँ लोग नेस्टेड स्क्रीन का उल्लेख करते हैं, इसलिए मुझे लगता है कि यहां टिप्पणी करने के लिए एक उपयुक्त स्थान है
टिम राए

1

खैर, यह आज भी मेरे लिए एक मुद्दा है (18 नवंबर 2015)। मैंने इस धागे से सभी समाधानों की कोशिश की है, लेकिन दो मुख्य चीजें थीं जिन्हें मैं हल नहीं कर सकता था:

  • बिना वरीयता वाले स्क्रीन टूलबार के बिना दिखाई दिए
  • पूर्व-लॉलीपॉप उपकरणों पर सामग्री की प्राथमिकता नहीं थी

इसलिए मैंने अधिक जटिल समाधान के साथ एक पुस्तकालय का निर्माण किया। असल में, मैं हम एक पूर्व लॉलीपॉप डिवाइस का उपयोग कर रहे हैं और मैं भी नेस्टेड स्क्रीन (सभी PreferenceScreen की नेस्टेड पदानुक्रम लेने लाभ बहाल करने के लिए एक कस्टम टुकड़ा का उपयोग कर नियंत्रित किया है, तो आंतरिक रूप से पसन्द के शैलियाँ लागू करने के लिए किया था कुंजी )।

पुस्तकालय यह एक है: https://github.com/ferrannp/material-preferences

और यदि आप स्रोत कोड में रुचि रखते हैं (यहां इसे पोस्ट करने के लिए बहुत लंबा है), तो यह मूल रूप से इसका मूल है: https://github.com/ferrannp/material-preferences/blob/master/library/src/main/ जावा / com / FNP / materialpreferences / PreferenceFragment.java

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.