স্ক্রীন থেকে একটি পছন্দ সরিয়ে / আড়াল করুন


134

আমার একটি ক্রিয়াকলাপ রয়েছে যা পছন্দের কার্যকলাপকে প্রসারিত করে। আমি এক্সএমএল ফাইল থেকে পছন্দগুলি লোড করছি। তবে কিছু ক্ষেত্রে আমার অ্যাপের অবস্থার উপর ভিত্তি করে আমার পর্দা থেকে পছন্দগুলির মধ্যে একটি পছন্দ সম্পূর্ণরূপে আড়াল করা দরকার। একটি সেট-এনেবলড পদ্ধতি রয়েছে তবে আমি যা চাই তা ঠিক তা নয়। আমি সেই পছন্দটি পুরোপুরি পর্দা থেকে সরাতে চাই। এটা কি সম্ভব ?

উত্তর:


171

হ্যাঁ, যদি আপনার Preferenceএবং এর পিতামাতা উভয়ের একটি রেফারেন্স থাকে তবে (ক PreferenceCategory, বা PreferenceScreen)

myPreferenceScreen.removePreference(myPreference);

গ্রেট! ধন্যবাদ! কাজ করে এবং নিখুঁত অর্থে তোলে
বোস্টোন

আমি কি এর মাধ্যমে আমার নিজের প্রশ্নের উত্তর দিতে পারি? stackoverflow.com/a/4704360/956975
marienke

2
দুর্ভাগ্যক্রমে, এটি স্থায়ীভাবে পছন্দটি সরিয়ে দেয়। এটা কি কেবল লুকিয়ে রাখা সম্ভব?
দিমিত্রি

এটি আমার পক্ষেও কাজ করে না। অগ্রাধিকার রয়ে গেছে!
দিমিত্রি

@ দিমিত্রি আপনি এটি দিয়ে ধূসর করতে পারেনsetEnabled()
জ্যাকডি

212

যদি আপনার Preferenceএকটি এর মধ্যে থাকে তবে PreferenceCategoryআপনাকে এটি করতে হবে:

এক্সএমএল:

<PreferenceCategory
    android:key="category_foo"
    android:title="foo">

    <CheckBoxPreference
        android:key="checkPref" />

জাভা:

CheckBoxPreference mCheckBoxPref = (CheckBoxPreference) findPreference("checkPref");
PreferenceCategory mCategory = (PreferenceCategory) findPreference("category_foo");
mCategory.removePreference(mCheckBoxPref);

5
ন্যায়সঙ্গত হতে, উপরের উত্তরটি বলে যে আপনার পিতামাতার দরকার PreferenceCategory
ম্যাট

49

ক্ষেত্রে যেখানে পছন্দটি পছন্দ স্ক্রিনের সরাসরি শিশু, এখানে কিছু স্ট্যান্ড-অলোন কোড রয়েছে:

PreferenceScreen screen = getPreferenceScreen();
Preference pref = getPreferenceManager().findPreference("mypreference");
screen.removePreference(pref);

4
পছন্দটি বিভাগের অভ্যন্তরে অবস্থিত থাকলে এই কাজ করবে না। আপনাকে findPreferenceবিভাগের জন্য থাকতে হবে এবং বিভাগ থেকে পছন্দটি সরিয়ে ফেলতে হবে
এমবিএইচ

1
@ এমবিএইচ: এই সতর্কতার কথা উল্লেখ করার জন্য ধন্যবাদ!
1 ''

9

আপনি যদি এমন কিছু চান যা গতিবেগে একটি সুইচপ্রাইফারেন্সে প্রিফগুলি পরিবর্তন করে, আমি আমার সমস্ত সাব বিকল্পগুলি দুটি বিভাগের ধারক মধ্যে রাখাই সবচেয়ে ভাল উপায় খুঁজে পেয়েছি। প্রথমদিকে আপনার সমস্ত কিছু দেখানো হবে, তারপরে আপনি নিজের পছন্দমতো বিটগুলি সরিয়ে ফেলবেন। চতুর বিট, আপনি যখন কিছু পরিবর্তন করেন কেবল তখনই পুনরায় বিনোদন শুরু করেন এবং তারপরে আপনাকে ম্যানুয়ালি কোনও কিছু তৈরি করতে হবে না বা জিনিসগুলি সঠিক ক্রমে ফিরিয়ে দেওয়ার বিষয়ে চিন্তা করতে হবে না।

protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  addPreferencesFromResource(R.xml.preferences);
  PreferenceCategory prefCatOne= (PreferenceCategory)findPreference("prefCatOne");
  PreferenceCategory prefCatTwo= (PreferenceCategory)findPreference("prefCatTwo");
  SwitchPreference mySwitchPref= (SwitchPreference)findPreference("mySwitchPref");
  PreferenceScreen screen = getPreferenceScreen();
  if (mySwitchPref.isChecked()) {
    screen.removePreference(prefCatOne);
  } else {
    screen.removePreference(prefCatTwo);
  }
}

public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
    if (key.equals("mySwitchPref")) {
        this.recreate();
    }
}

আমি কেবল এটিই দেখতে পাচ্ছি, স্ক্র্যাচটি স্ক্র্যাচ থেকে পুনরায় তৈরি করার সাথে সাথে একটি ফ্ল্যাশ রয়েছে।


কেসটি কাজ করে না, কমপক্ষে ২২-এ নয় But তবে এটিকে কোনও পছন্দতে পরিবর্তন করা (যদিও এটি পছন্দগুলির একটি দলবদ্ধ হওয়া) কাজ করে।
রব

রব, আমি উপরের কোডটি কেবল একটি এপিআই 22 এভিডিতে পরীক্ষা করেছি এবং এটি ঠিক কাজ করছে। আপনার পছন্দসই এক্সএমএল সামগ্রীটি আপনার কোডের সাথে মেলে কিনা তা নিশ্চিত করুন। উপরের উদাহরণের জন্য স্যুইচপ্রেফারেন্সটি যে কোনও জায়গায় হতে পারে, তবে আপনার পছন্দস্ক্রিনির সরাসরি বাচ্চা হওয়ার জন্য পছন্দক্রমশ্রেণীর প্রয়োজন।
জেমস

আমি সবেমাত্র বিভাগটি পছন্দ হিসাবে পেয়েছি, কোনও castালাই নেই এবং এটি সরিয়েছি। কাজ করছে.
রব

8

আপনার এক্সএমএল ফাইলটিতে:

<PreferenceScreen 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:key="preferenceScreen">

    <PreferenceCategory
        android:key="personalisation"
        android:title="your title here">

        <ThemedPreference
            android:key="animation" />

</PreferenceScreen>

আপনার কোডে:

PreferenceScreen pPreferenceScreen = (PreferenceScreen) findPreference("preferenceScreen");

PreferenceCategory pCategory = (PreferenceCategory) findPreference("personalisation");
ThemedPreference pThemePref = (ThemedPreference) findPreference("animation");

pPreferenceScreen.removePreference(pCategory); //remove category
pCategory.removePreference(pThemePref);   // remove preference

8

আপনি যদি পছন্দের ফ্রেমক্যাম্প্যাট ব্যবহার করে থাকেন তবে আপনি এক্সএমএলে ভিজিবিটিটি সেট করতে পারেন।

আপনার এক্সএমএলে থাকা পছন্দগুলি স্বয়ংক্রিয়ভাবে অ্যাপকম্প্যাট সংস্করণে রূপান্তরিত হবে। তারপরে আপনি আপনার এক্সএমএলে ' অ্যাপ: isPreferencesVisible ' বৈশিষ্ট্যটি ব্যবহার করতে পারেন

preferences.xml

<PreferenceScreen 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">

    <CheckBoxPreference
        android:defaultValue="false"
        android:key="show.navigation"
        android:title="Show navigation"
        app:isPreferenceVisible="false" />

...

বৈশিষ্ট্যটি https://developer.android.com/guide/topics/ui/settings/comp घटक-and-attributes এ নথিভুক্ত করা হয়েছে

যুক্তটি https://developer.android.com/guide/topics/ui/settings/#inflate_the_hierarchyPreferenceFragmentCompat এ নথিভুক্ত করা হয়েছে

উদাহরণ:

public class MySettingsActivity extends AppCompatActivity {

    public static class MySettingsFragment extends PreferenceFragmentCompat {
        @Override
        public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
            setPreferencesFromResource(R.xml.preferences, rootKey);
        }
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getSupportFragmentManager()
                .beginTransaction()
                .replace(R.id.settings_container, new MySettingsFragment())
                .commit();
    }
} 

5

আমি v7 পছন্দ ব্যবহার করার পরামর্শ দিচ্ছি, এর setVisible()পদ্ধতি আছে। তবে আমি এখনও চেষ্টা করে দেখিনি। সেই অনুযায়ী আপনার PreferenceFragmentপরিবর্তে ব্যবহার করতে হবে PreferenceActivity


গৃহীত উত্তর ভি 7 এর জন্য কাজ করবে না। সেটভিজিবল ব্যবহার করা ভি 7
m12lrpv

3

এক্সএমএল ফাইলে আপনি শিরোনাম এবং সারাংশ ট্যাগ খালি রেখে একটি গোপন পছন্দ করতে পারেন make

<EditTextPreference
    android:defaultValue="toddlerCam"
    android:key="save_photo_dir"
/>

এটি আমার কাছে সঠিক উত্তর। আমি এটি খুঁজছিলাম। ধন্যবাদ!
期 劇場

2

এটি করার একটি সাধারণ উপায় এখানে অগ্রাধিকারটি একটি PreferenceCategoryবা এর অধীন কিনা তা নির্বিশেষে কাজ করে PreferenceScreen

private void removePreference(Preference preference) {
    PreferenceGroup parent = getParent(getPreferenceScreen(), preference);
    if (parent == null)
        throw new RuntimeException("Couldn't find preference");

    parent.removePreference(preference);
}

private PreferenceGroup getParent(PreferenceGroup groupToSearchIn, Preference preference) {
    for (int i = 0; i < groupToSearchIn.getPreferenceCount(); ++i) {
        Preference child = groupToSearchIn.getPreference(i);

        if (child == preference)
            return groupToSearchIn;

        if (child instanceof PreferenceGroup) {
            PreferenceGroup childGroup = (PreferenceGroup)child;
            PreferenceGroup result = getParent(childGroup, preference);
            if (result != null)
                return result;
        }
    }

    return null;
}


0

আপনি এটি 2 উপায়ে করতে পারেন:

1. আপনি যদি সমর্থন লাইব্রেরি ব্যবহার করেন তবে আপনি পছন্দসই গাছ এবং তাদের পিতামাতার একটি মানচিত্র তৈরি করতে পারেন এবং তারপরে অভিভাবককে ব্যবহার করে পছন্দটিকে সরিয়ে ফেলতে পারেন। এই জাতীয় মানচিত্র তৈরি করার জন্য এখানে একটি ফাংশন রয়েছে:

public static Map<Preference, PreferenceGroup> buildPreferenceParentTree(@NonNull final PreferenceScreen preferenceScreen) {
    final Map<Preference, PreferenceGroup> result = new HashMap<>();
    final Stack<PreferenceGroup> curParents = new Stack<>();
    curParents.add(preferenceScreen);
    while (!curParents.isEmpty()) {
        final PreferenceGroup parent = curParents.pop();
        final int childCount = parent.getPreferenceCount();
        for (int i = 0; i < childCount; ++i) {
            final Preference child = parent.getPreference(i);
            result.put(child, parent);
            if (child instanceof PreferenceGroup)
                curParents.push((PreferenceGroup) child);
        }
    }
    return result;
}
  1. আপনি যদি নতুন অ্যান্ড্রয়েড-এক্স প্রেফারেন্স এপিআই ব্যবহার করেন তবে এটিতে সেটভিভিবল ফাংশনটি ব্যবহার করে আপনি দৃশ্যমানতা সেট করতে পারেন ।

মতে ডক্স এবং চা এর উত্তর setVisible() সাপোর্ট গ্রন্থাগার সংস্করণ 24.1.0 যেহেতু পাওয়া যায়।
জেজেডি

আমি কি লিখেছি তা কি আপনি দেখেছেন? আমি স্পষ্টতই লিখেছি যে এটি এখনই সম্ভব ... এছাড়াও, প্রথম সমাধানটি অপসারণে সহায়তা করে যা লুকিয়ে থাকার চেয়ে কিছুটা আলাদা ..
অ্যান্ড্রয়েড বিকাশকারী

হ্যাঁ, আমি আপনার উত্তর পড়েছি। আমি আপনার ২ য় পয়েন্ট উল্লেখ করছি। এটি পড়তে পারে যেন setVisibile()পদ্ধতিটি অ্যান্ড্রয়েড-এক্স থেকে পাওয়া যায় যা আমি স্পষ্ট করার চেষ্টা করেছি। কোন অপরাধ দয়া করে।
জেজেডি

সমস্ত সমর্থন লাইব্রেরি প্রতিস্থাপন করার জন্য অ্যান্ড্রয়েড-এক্স। সমর্থন লাইব্রেরির কোনও নতুন সংস্করণ থাকবে না যেহেতু আমরা সেগুলি জানি।
অ্যান্ড্রয়েড বিকাশকারী

সঠিক। আমি এই সম্পর্কে সচেতন । তবুও, পূর্ববর্তী সংস্করণগুলির সাথে জড়িত ব্যক্তিরা পদ্ধতিটি ব্যবহার করতে পারেন।
জেজেডি

0

আপনি যদি মূল্যায়ন করতে চান, এবং সেই মুখোশের উপর ভিত্তি করে, বিকল্প হতে পারে

SwitchPreference autenticacionUsuario = 
    (SwitchPreference) findPreference("key_autenticacion_usuario");

final EditTextPreference Username = 
    (EditTextPreference) findPreference("key_username_mqtt");
final EditTextPreference Password = 
    (EditTextPreference) findPreference("key_password_mqtt");

if (!autenticacionUsuario.isChecked()) {
    PreferenceCategory preferenceCategory = 
        (PreferenceCategory) findPreference("category_mqtt");
    preferenceCategory.removePreference(Username);
    preferenceCategory.removePreference(Password);
}

এই সব অবশ্যই এর মধ্যে থাকা উচিত

public static class PrefsFragment extends PreferenceFragment {

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

1
দুঃখিত, তবে এটি একটি ইংরেজি সাইট। আপনি কি ইংরেজিতে উত্তর দিতে পারবেন?
ডেভ শোয়েসগুথ

অবশ্যই আমার উদ্দেশ্যটিও ছিল যারা ইংরেজি না বলে তাদের জন্য সরবরাহ করা
গুস্তাভো এদুয়ার্দো বেলদুমা

3
@ গুস্তাভো এদুয়ার্ডোবেলডুমা তখন আপনার এই মেটা.স্ট্যাকওভারফ্লো.com
লিও মনিকা সেলিওকে

0

আপনি যা করতে চাইছেন আপনি যদি তা করে থাকেন তবে (কারণ আমি এখন এটি করার চেষ্টা করছি) পছন্দটি সক্ষম / অক্ষম করা আরও ভাল। কারণ এটি অপসারণ এটিকে পছন্দসই স্ক্রিনের বাইরে নিয়ে যায় এবং আপনি যদি স্ক্রিনটিকে প্রোগ্রামগতভাবে তৈরি করে থাকেন তবে আপনি এটি যেখানে চান তা আবার যুক্ত করতে সক্ষম হবেন না।

pref.setEnabled (মিথ্যা); pref.setEnabled (সত্য);

যদিও এটি হ্রাস করা যেতে পারে। এটি ব্যবহারের ক্ষেত্রে কাজ করে যা আমি এখনই যাচ্ছি।

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