সমর্থন (v21) সরঞ্জামদণ্ড সহ একটি পছন্দ স্ক্রিন তৈরি করা


116

পছন্দ স্ক্রিনে সমর্থন লাইব্রেরিতে নতুন মেটালিয়াল ডিজাইনের সরঞ্জামদণ্ডটি ব্যবহার করতে আমার সমস্যা হয়েছিল।

আমার নীচের মতো একটি সেটিংস.এক্সএমএল ফাইল রয়েছে:

<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 এই উত্তরের সমর্থন লাইব্রেরির জন্য একটি সঠিক সমাধান রয়েছে
হরিশন্নাম

উত্তর:


110

দয়া করে গিটহাব রেপোটি সন্ধান করুন: এখানে


পার্টিতে কিছুটা দেরি হলেও এটি আমার সমাধান যা আমি ব্যবহার অব্যাহত রাখার কাজ হিসাবে ব্যবহার করছি 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 :

উদাহরণ


আপডেট (জিনজারব্রেড সামঞ্জস্যতা):

মন্তব্য অনুসারে, জিঞ্জারব্রেড ডিভাইসগুলি এই লাইনে নালপয়েন্টার এক্সসেপশন ফিরিয়ে দিচ্ছে:

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তেমন উপাদানগুলির রঙিনকে সমর্থন করে না তবে কয়েকটি অভ্যন্তরীণ ক্লাস ব্যবহার করে আপনি এটি অর্জন করতে পারেন। এই ক্লাসগুলি অপসারণ না হওয়া অবধি। (অ্যাপকম্প্যাট সমর্থন-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


অ্যাপকম্প্যাট 22.1

অ্যাপক্যাম্প্যাট 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;
}

প্রয়োজনীয় পছন্দসই স্ক্রিনগুলি

অনেক মানুষ একটি নেস্টেড মধ্যে <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'

অ্যান্ড্রয়েড 6.0

আমি উল্লিখিত ওভারল্যাপিং ইস্যুটি তদন্ত করেছি এবং আমি সমস্যাটি পুনরুত্পাদন করতে পারি না।

উপরোক্ত হিসাবে ব্যবহারের পূর্ণ কোড নিম্নলিখিতটি উত্পাদন করে:

এখানে চিত্র বর্ণনা লিখুন

যদি আমি কিছু মিস করছি তবে দয়া করে আমাকে এই রেপোর মাধ্যমে জানান এবং আমি তদন্ত করব।


এটি জিনজ্রেডে নালপয়েন্টার ব্যতিক্রম দেয়, মূলটি নাল..আর কোন সমাধান?
এবংক্লিম্যাক্স

আপনার সমাধান দুর্দান্ত কাজ করে। তবে এই পদ্ধতির সাথে একটি সমস্যা রয়েছে, অ্যাকশনবার অ্যাক্টিভিটি না বাড়িয়ে প্রকট যা <5.0 তে উপাদান থিম পেতে বাধ্যতামূলক (ডকুমেন্টেশন থেকে), কালারঅ্যাকসেন্ট (কেবল উদাহরণ হিসাবে তৈরি করতে) ডিভাইসে চেকবক্সগুলিতে প্রয়োগ করা হয়নি <5.0 5 এটি একটি আসল ব্যথা বলে মনে হচ্ছে..এছাড়াও আমাকে পছন্দ ক্রিয়াকলাপটি সরাতে হবে এবং একটি পছন্দ স্ক্রিন অনুকরণ করার জন্য একটি রৈখিক বিন্যাস ব্যবহার করতে হবে, অন্যথায় আমি এপিআই স্তর 8 থেকে 21 পর্যন্ত ডিভাইসগুলিতে উপাদান থিম ব্যবহার করার কোনও উপায় দেখতে পাচ্ছি না Preference পছন্দসই খণ্ডটি "কেবল"> 11 :(
ক্লেম্যাক্স

1
@ এবংক্লিম্যাক্স আমি টিংটিং ইস্যুটির সমাধানের সাথে আমার উত্তর আপডেট করেছি
ডেভিড পাসমোর

3
@ ডেভিডপ্যাসমোর আমার জন্য পছন্দ তালিকার সরঞ্জামদণ্ডে ওভারল্যাপিং করছে
শশাঙ্ক শ্রীবাস্তব

1
@ শশাঙ্কস্রাইভাস্তভা এটি প্রতিফলিত হয় যদি আপনি অ্যান্ড্রয়েড 6 ব্যবহার করেন তবে আমি এর সমাধানের জন্য কাজ করছি। আপডেটের জন্য ধন্যবাদ.
ডেভিড পাসমোর 20

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

এবং এখানে লেআউট ফাইলটি রয়েছে (প্রিফ_উইথ_অ্যাকশনবার):

<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
আমি মনে করি তিনি মূল পছন্দ এক্সএমএলে এম্বেড থাকা পছন্দ স্ক্রিনের কথা বলছেন।
লুকাস এস 21

5
আমি
মতামতটি

12
এটি উভয়ই নিয়ে কাজ করবে। ব্যবহারিকভাবে, বস্তুগতভাবে নকশা করা, সরঞ্জামবাহিত, নেস্টেড পছন্দের স্ক্রিনগুলি তৈরি করার কোনও উপায় বলে মনে হয় না। আপনি যদি ActionBarActivityসরঞ্জামদণ্ড এবং সম্পর্কিত ফাংশনগুলি পেতে একটি ব্যবহার করেন তবে সেখানে onBuildHeaders()ওভাররাইড করার দরকার নেই এবং ক্রিয়ায় কোনও প্রকৃত পছন্দ সমর্থন নেই। আপনি যদি পুরানটি ব্যবহার করেন তবে PreferenceActivityআপনার কাছে সরঞ্জামদণ্ড এবং সম্পর্কিত ফাংশন নেই (হ্যাঁ, আপনি একটি Toolbarলেআউট এবং লেআউট পেতে পারেন তবে আপনি কল করতে পারবেন না setSupportActionBar()So সুতরাং, পছন্দসই শিরোনাম বা নেস্টেড পছন্দসই পর্দার সাহায্যে আমরা আটকে দেখি
গ্যাবার

1
আমি গ্যাবারের মন্তব্যে একমত এই সমাধানটি সাধারণভাবে কাজ করে না। এমুলেটিং টুলবারের সাথে আরও ভাল বেলো রয়েছে (অ্যাকশনবার নয়, তবে কে যত্নশীল) এবং অ্যাপকম্প্যাটডেলিগেট বোর্ডে প্রকাশিত নতুন সমর্থন লিবিও রয়েছে।
ইউজিন ওয়েচসলার

48

সম্পূর্ণ নতুন আপডেট।

কিছু পরীক্ষা-নিরীক্ষার মাধ্যমে, আমি মনে করি নেস্টিং পছন্দসই পর্দার জন্য কার্যকরী অ্যাপকম্প্যাট 22.1+ সমাধান পেয়েছি।

প্রথমত, যেমনটি অনেক উত্তরে বর্ণিত হয়েছে (এখানে একটি সহ), আপনাকে নতুনটি ব্যবহার করতে হবে AppCompatDelegate। হয় AppCompatPreferenceActivity.javaসমর্থন ডেমো থেকে ফাইলটি ব্যবহার করুন ( https://android.googlesource.com/platfor/de વિકાસment/+/58bf5b99e6132332afb8b44b4c8cedf5756ad464/sample/Support7Demos/src/com/example/android/supportvat/P/ ASPCtivity এটি থেকে, বা আপনার নিজের মধ্যে প্রাসঙ্গিক ফাংশন অনুলিপি করুন 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শিরোনামগুলির পরামিতিগুলির দ্বারা আলাদা । প্রতিটি পৃষ্ঠার একটি সাধারণ 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
রিডকুলি

এই সমাধানের সাহায্যে আমার মনে হয় যে সরঞ্জামদণ্ডটি সঠিকভাবে সামগ্রীতে স্ক্রোল করবে? কারণ এটি অভ্যন্তরীণ তালিকার ভিউতে কেবল একটি আইটেম।
টসোমানিয়াক

এই আপডেট করা, নতুন সমাধান সঙ্গে নয়। এটি প্রত্যাশার মতোই কাজ করে।
গ্যাবার

আশ্চর্যজনকভাবে, এই সমাধানটির PreferenceFragmentCompatপরিবর্তে কোনওটিকে স্বীকৃতি বলে মনে হচ্ছে না PreferenceFragment। এর পরিবর্তে একটি সেট আপ preference-headerকরা xmlns:app="http://schemas.android.com/apk/res-auto" এবং কোনও নতুন প্রিফেস স্ক্রিন লোড করে না। সুতরাং ডাব্লু / পিছনের সামঞ্জস্যতা সমস্যা আছে ... পরামর্শ? app:fragmentandroid:fragment
মোটামুটি

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(এবং এখনো যদি টুকরা-কম, headerless পথে ব্যবহার করে) পক্ষপাত তালিকা নিজেই জন্য পরিবর্তে।
ডেভিডসিএসবি

2
আমার মনে হয় অ্যান্ড্রয়েডের কোডটি যাচাই করা ভাল, এটির কী প্রয়োজন তা দেখার জন্য, তার ভিউর ভাড়াটি দিয়ে ঘোরাফেরা করার পরিবর্তে (এতে থাকা ভিউগুলি সরান / যুক্ত করুন)। আমি মনে করি এটি এভাবে নিরাপদ। আমি "preferences_list_content" ফাইলটি পরীক্ষা করে দেখার পরামর্শ দিই।
অ্যান্ড্রয়েড বিকাশকারী

2
এটি এই থ্রেডের সেরা উত্তর। এই নিবন্ধটির লেখক এটি সম্পূর্ণ রেফারেন্স বাস্তবায়নে প্রসারিত করেছেন, যা আমি ব্যবহার করেছি। প্রকৃতপক্ষে, আপনার অ্যাপটিতে পরিশীলিত পছন্দগুলি সমর্থন করার জন্য এটিই একমাত্র কার্যকরী সমাধান।
ইউজিন ওয়েচসলার

17

অ্যান্ড্রয়েড সাপোর্ট লাইব্রেরি 22.1.0 এবং নতুন অ্যাপকম্প্যাটডেলিগেট প্রকাশের সাথে সাথে আপনি এখানে পিছনের সামঞ্জস্যের সাথে উপাদান সমর্থন সহ পছন্দসই কার্যকলাপের বাস্তবায়নের একটি দুর্দান্ত নমুনা খুঁজে পেতে পারেন sample

আপডেট এটি নেস্টেড পর্দার উপরও কাজ করে।

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


1
ওহ, এটি দুর্দান্ত খবর! সুতরাং দেখা যাচ্ছে যে এই নতুন দৃষ্টিকোণে "এক্সটেন্ডার অ্যাক্টিভিয়ার্টিভিটি" এর তুলনায় "প্রসারিত পছন্দবৃত্তি" ভিত্তিক সমাধানগুলি আরও ভাল।
ইউজিন ওয়েচসলার

1
@ ইউজেন ওয়েলস্লার হ্যাঁ, অ্যাকশনবার্যাকটিভিটি এখন অবচয় করা হয়েছে।
মিঃব্রাইটসাইড

এই সমাধানটি নেস্টেড স্ক্রিনগুলিতেও কাজ করবেন? এর চেয়ে ভাল উদাহরণ আর কী আছে?
টমাস

@ টমাস আমি এখনও চেষ্টা করি নি, তবে এটি নেস্টেড পর্দাগুলিতেও কাজ করা উচিত। যদি আপনার জন্য কাজ করে তবে আমাদের বলুন।
মিঃ ব্রাইটসাইড

অনেক ধন্যবাদ ! গ্যালাক্সি নেক্সাসে (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

আমিও AppCompatPreferencesActivity (যা সেটিংসঅ্যাক্টিভিটি যুক্ত করার সময় অ্যান্ড্রয়েড স্টুডিও দ্বারা স্বয়ংক্রিয়ভাবে তৈরি করা হয়েছে) এ v7 সমর্থন সরঞ্জামদণ্ড ( এপিআই 25 ) যুক্ত করার সমাধান সন্ধান করছি । বেশ কয়েকটি সমাধান পড়ার পরে এবং সেগুলির প্রত্যেকটি চেষ্টা করে দেখার পরেও আমি একটি সরঞ্জামদণ্ড দিয়ে প্রদর্শন করার জন্য উত্পন্ন পছন্দনীয় ফ্রেম উদাহরণগুলি পেতে সংগ্রাম করেছি।

একটি পরিবর্তিত সমাধান যা এই ধরণের কাজ করেছিল তা ছিল " গ্যাবোর " থেকে।

আমি যে সাবধানতার মুখোমুখি হয়েছিলাম তার মধ্যে একটি হ'ল 'অন বিল্ডহাইডার্স' একবারে কেবল আগুন লেগেছে। আপনি যদি কোনও ডিভাইস (ফোনের মতো) পাশাপাশি রাখেন তবে দৃশ্যটি পুনরায় তৈরি হয় এবং পছন্দসই কার্যকলাপটি আবার কোনও সরঞ্জামদণ্ড ছাড়াই রেখে দেওয়া হয়, তবে পছন্দসই অংশগুলি তাদের ধরে রাখে।

আমি 'onPostCreate' ব্যবহার করে 'সেটকন্টেন্টভিউ' কল করতে চেষ্টা করেছি, যখন এটি যখন সরঞ্জামদণ্ডটি পুনরায় তৈরি করার কাজ করেছিল যখন ওরিয়েন্টেশন পরিবর্তিত হয়, পছন্দক্রমগুলি খালি রেন্ডার হয়ে যায়।

আমি প্রতি টিপস এবং উত্তর সম্পর্কে আমি কীভাবে উত্থাপিত হয়েছি তা এই বিষয়টি সম্পর্কে পড়তে পারি। আমি আশা করি অন্যরাও এটির কাজে লাগবে।

আমরা জাভা দিয়ে শুরু করব

প্রথমে (উত্পন্ন) AppCompatPreferencesActivity.java আমি 'সেটসপোর্টঅ্যাকশনবার' এর মতো পরিবর্তন করেছি:

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

দ্বিতীয়ত , আমি অ্যাপকম্প্যাটপ্রিফারেন্সফ্র্যাগমেন্ট.জভা নামে একটি নতুন ক্লাস তৈরি করেছি (এটি বর্তমান একটি অব্যবহৃত নাম, যদিও এটি সেভাবে নাও থাকতে পারে!):

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 পরিবর্তে'।

কোডের সংক্ষিপ্তসার : যদি কোনও খণ্ড উপস্থিত থাকে, খণ্ডটি নতুন লেআউটটিকে ইনজেক্ট করে এবং সংশোধিত 'সেটসপোর্টঅ্যাকশনবার' ফাংশনটিকে কল করে। যদি খণ্ডটি উপস্থিত না থাকে, সেটিংসঅ্যাক্টিভিটি 'onPostCreate' এ নতুন লেআউটটিকে ইনজেক্ট করে

এখন এক্সএমএল (খুব সাধারণ):

ক্রিয়াকলাপ_সেটিং.এক্সএমএল :

<?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>

অ্যাপ_বার_সেটিং.এক্সএমএল :

<?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>

কন্টেন্ট_সেটিং.এক্সএমএল :

<?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এটি সমর্থন ভি 7 নমুনা থেকে ব্যবহার করে । এই কোডটি হাতে নিয়ে আমি আমার নিজস্ব বিন্যাস তৈরি করেছি যাতে একটি সরঞ্জামদণ্ড অন্তর্ভুক্ত রয়েছে:

<?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
oদো 95

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উচিত implemented নোট করুন যে ব্যক্তিগত 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()যেহেতু শুধুমাত্র টুকরা দৃশ্যে না টুলবার প্রত্যেক এ পরিবর্তিত হয় কমিট, সমস্ত PreferenceFragment মধ্যে;

আছে কোন প্রয়োজন (Gábor এর উত্তর দেখুন) প্রতিটি preference.xml মধ্যে যোগ করার জন্য একটি জাল ToolbarPreference বর্গ তৈরি করুন।


1

এখানে আমি তৈরি করেছি এমন একটি লাইব্রেরি যা এওএসপি কোডের উপর ভিত্তি করে তৈরি করা হয়, যা উভয় পছন্দ এবং ডায়লগগুলিতে টিন্টিং যুক্ত করে, একটি অ্যাকশন বার যুক্ত করে এবং এপিআই 7 থেকে সমস্ত সংস্করণ সমর্থন করে:

https://github.com/AndroidDeveloperLB/MaterialPreferenceLibrary


কোডটি দেখার থেকে, এটি নেস্টেড পছন্দগুলির জন্য কাজ করে না ...?
টিম রে

@ টিমরাই আমি নিশ্চিত নই যে আপনি যা বলছেন তা আমি পরীক্ষা করেছি। আপনি কি বলতে চাইছেন দয়া করে ব্যাখ্যা করুন। আপনি যে দৃশ্যটি সঠিকভাবে ব্যবহার করার চেষ্টা করছেন তা কী?
অ্যান্ড্রয়েড বিকাশকারী

আপনি যদি একটি আছে PreferenceScreenভিতরে PreferenceScreenমত এই
টিম রায়

আমি এ জাতীয় জিনিস ব্যবহার করিনি। দস্তাবেজগুলি পড়া:: ডেভেলপার.আ্যান্ড্রয়েড .com/references/android/preferences/… , আমি দেখছি এটি পর্দার মধ্যে যেতে সহায়তা করতে পারে। তুমি বলো আমিও এটা যুক্ত করব? আমি এটি যাচাই করব . ধন্যবাদ. এছাড়াও, দয়া করে পরের বার এই জাতীয় জিনিস (অনুরোধ এবং সমস্যা) জন্য গিথুব ব্যবহার করুন।
অ্যান্ড্রয়েড বিকাশকারী

হ্যাঁ এটি কার্যকর যখন আপনার একক স্ক্রিনের জন্য অনেক বেশি পছন্দ থাকে ... ইতিমধ্যে এই থ্রেডে বেশ কয়েকটি জায়গা রয়েছে যেখানে লোকেরা নেস্টেড পর্দার উল্লেখ করেছেন, তাই আমি মনে করি এখানে মন্তব্য করার উপযুক্ত জায়গা আছে
টিম রায়

1

ঠিক আছে, এটি আমার কাছে আজও একটি সমস্যা (18 নভেম্বর 2015)। আমি এই থ্রেড থেকে সমস্ত সমাধান চেষ্টা করেছি তবে দুটি মূল বিষয় ছিল যা আমি সমাধান করতে পারিনি:

  • নেস্টেড পছন্দের স্ক্রিনগুলি সরঞ্জামদণ্ড ছাড়াই উপস্থিত হয়েছিল
  • প্রি-ললিপপ ডিভাইসে পছন্দসইগুলিতে উপাদানের চেহারা ছিল না

সুতরাং আমি আরও জটিল সমাধান সহ একটি লাইব্রেরি তৈরি শেষ করেছি। মূলত, যদি আমরা প্রাক-ললিপপ ডিভাইস ব্যবহার করি তবে আমাকে অভ্যন্তরীণভাবে পছন্দগুলিতে শৈলী প্রয়োগ করতে হয়েছিল এবং আমি কাস্টম টুকরা ব্যবহার করে নেস্টেড স্ক্রিনগুলিও পরিচালনা করেছি (পছন্দসই স্ক্রিন কীটি ব্যবহার করে সমস্ত নেস্টেড হাইয়ারার্কি পুনরুদ্ধার )।

গ্রন্থাগারটি হ'ল: https://github.com/ferrannp/matory- পছন্দসমূহ

এবং যদি আপনি উত্স কোডটিতে আগ্রহী হন (এটি এখানে পোস্ট করা খুব দীর্ঘ), এটি মূলত এটির মূল বিষয়: https://github.com/ferrannp/matory-preferences/blob/master/library/src/main/ জাভা / কম / fnp / materialpreferences / PreferenceFragment.java

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.