Xóa / ẩn tùy chọn khỏi màn hình


134

Tôi có một hoạt động mở rộng PreferenceActivity. Tôi đang tải tùy chọn từ tệp xml. Nhưng trong một số trường hợp, tôi cần ẩn hoàn toàn một trong các tùy chọn khỏi màn hình dựa trên trạng thái ứng dụng của mình. Có một phương thức setEnables, nhưng nó không chính xác như tôi muốn. Tôi muốn loại bỏ hoàn toàn sở thích đó khỏi màn hình. Có thể không?

Câu trả lời:


171

Có, nếu bạn có một tham chiếu đến cả Preferencevà cha mẹ của nó (a PreferenceCategory, hoặc PreferenceScreen)

myPreferenceScreen.removePreference(myPreference);

Tuyệt quá! Cảm ơn! Hoạt động và có ý nghĩa hoàn hảo
Bostone

Tôi có thể đã trả lời câu hỏi của riêng tôi thông qua điều này? stackoverflow.com/a/4704360/956975
marienke

2
Thật không may, nó vĩnh viễn loại bỏ các ưu tiên. Có thể chỉ để che giấu nó?
Dmitry

Nó cũng không làm việc cho tôi. Các ưu tiên vẫn còn!
Dmitry

@Dmitry Bạn chỉ có thể tô màu xám vớisetEnabled()
JakeD

212

Nếu bạn Preferenceở trong một PreferenceCategory, bạn phải làm điều này:

XML:

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

    <CheckBoxPreference
        android:key="checkPref" />

Java:

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

5
Để công bằng, câu trả lời trên có nói rằng bạn cần cha mẹ PreferenceCategory.
matt

49

Trong trường hợp Tùy chọn là con trực tiếp của màn hình ưu tiên, đây là một số mã độc lập:

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

4
Điều này sẽ không hoạt động nếu ưu tiên nằm trong danh mục. bạn phải findPreferencecho danh mục và xóa tùy chọn khỏi danh mục
MBH

1
@MBH: Cảm ơn bạn đã đề cập đến lời cảnh báo đó!
1 ''

9

Nếu bạn muốn một cái gì đó sẽ thay đổi động các prefs chẳng hạn trên SwitchPreference, tôi đã tìm ra cách tốt nhất là đặt tất cả các tùy chọn phụ của tôi vào hai thùng chứa danh mục. Ban đầu bạn sẽ có mọi thứ hiển thị, sau đó bạn chỉ cần loại bỏ các bit bạn không muốn. Một chút thông minh, là bạn chỉ kích hoạt tái tạo khi có thứ gì đó thay đổi và sau đó bạn không phải tự tạo bất cứ thứ gì hoặc lo lắng về việc sắp xếp lại mọi thứ theo đúng thứ tự.

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

Nhược điểm duy nhất mà tôi có thể thấy với điều này, là có đèn flash khi màn hình được tạo lại từ đầu.


Trường hợp này không hoạt động, ít nhất là không phải trong 22. Nhưng thay đổi nó thành Tùy chọn (mặc dù đó là một nhóm các sở thích) không hoạt động.
Rob

Rob, tôi vừa kiểm tra mã trên trong API22 AV22 và nó hoạt động tốt. Đảm bảo nội dung XML ưu tiên của bạn khớp với mã của bạn. Đối với ví dụ trên, SwitchPreference có thể ở bất cứ đâu, nhưng bạn cần các PreferenceC Category để là con trực tiếp của PreferenceScreen.
James

Tôi chỉ nhận Danh mục là Ưu tiên, không chọn diễn viên và xóa nó. Đã làm việc.
Rob

8

Trong tệp XML của bạn:

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

Trong mã của bạn:

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

Nếu bạn đang sử dụng PreferenceFragmentCompat, bạn có thể đặt độ nhớt trong xml.

Các tùy chọn trong xml của bạn sẽ được tự động chuyển đổi thành các phiên bản AppCompat. Sau đó, bạn có thể sử dụng thuộc tính ' app: isPreferenceVisible ' trong xml của mình

sở thích

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

...

Thuộc tính được ghi lại tại https://developer.android.com/guide/topics/ui/sinstall/components-and-attribut

Việc thêm PreferenceFragmentCompatđược ghi lại tại https://developer.android.com/guide/topics/ui/sinstall/#inflate_the_hierarchy

Thí dụ:

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


3

Trong tệp XML, bạn có thể tạo một tùy chọn ẩn bằng cách để trống các tiêu đề và thẻ tóm tắt.

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

Đây là câu trả lời hoàn hảo cho tôi. Tôi đã tìm kiếm điều này. Cảm ơn bạn!
夏 期

2

Đây là một cách chung để làm điều này hoạt động bất kể ưu tiên là theo PreferenceCategoryhay 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

Bạn có thể làm điều này theo 2 cách:

1.Nếu bạn sử dụng thư viện hỗ trợ, bạn có thể tạo bản đồ cây ưu tiên và cha mẹ của họ, sau đó xóa tùy chọn bằng cách sử dụng cha mẹ của nó. Đây là một chức năng để tạo ra một bản đồ như vậy:

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. Nếu bạn sử dụng API ưu tiên android-x mới, bạn chỉ có thể đặt mức độ hiển thị, bằng cách sử dụng hàm setVisible trên nó.

Theo tài liệucâu trả lời của Tea setVisible() có sẵn kể từ phiên bản 24.1.0 của thư viện Hỗ trợ.
JJD

Bạn đã nhìn vào những gì tôi viết? Tôi đặc biệt viết rằng bây giờ có thể ... Ngoài ra, giải pháp đầu tiên giúp loại bỏ, khác một chút so với ẩn ..
nhà phát triển Android

Vâng, tôi đọc câu trả lời của bạn. Tôi đã đề cập đến điểm thứ 2 của bạn. Nó đọc như thể setVisibile()phương thức có sẵn từ android-x mà tôi đã cố gắng làm rõ. Không xúc phạm.
JJD

Android-X là ứng dụng thay thế tất cả các thư viện hỗ trợ. Sẽ không có bất kỳ phiên bản mới nào của thư viện hỗ trợ như chúng ta biết.
nhà phát triển Android

Chính xác. Tôi nhận thức được điều này . Tuy nhiên, những người bị mắc kẹt với các phiên bản cũ có thể sử dụng phương pháp này.
JJD

0

Nếu bạn muốn đánh giá, và dựa trên mặt nạ đó, một sự thay thế có thể là

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

Tất cả điều này phải nằm trong

public static class PrefsFragment extends PreferenceFragment {

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

1
Xin lỗi, nhưng đây là một trang web tiếng Anh. Bạn có thể trả lời bằng tiếng Anh không?
Dave Schweisguth

Tất nhiên, ý định của tôi cũng là cung cấp cho những người không nói tiếng Anh
Gustavo Eduardo Belduma

3
@GustavoEduardoBelduma sau đó bạn có thể cần phải đọc meta.stackoverflow.com/a/297680/545026
Leo hỗ trợ Monica Cellio

0

Nếu bạn đang làm những gì tôi nghĩ bạn đang cố gắng thực hiện (vì tôi đang cố gắng thực hiện ngay bây giờ) thì có thể tốt hơn để bật / tắt tùy chọn. Bởi vì loại bỏ nó sẽ đưa nó ra khỏi màn hình ưu tiên và bạn có thể không thể thêm nó trở lại nơi bạn muốn nếu bạn tạo màn hình theo chương trình.

pref.setEnables (false); pref.setEnables (đúng);

mặc dù điều này có thể không được chấp nhận Nó hoạt động cho trường hợp sử dụng mà tôi đang trải qua ngay bây giờ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.