Android получает представление о предпочтениях в PreferenceActivity

Я хотел бы получить экземпляр View, который используется для отображения определенных предпочтений в моей PreferenceActivity, поэтому я могу изменить его свойства, например:

public class SettingsActivity extends PreferenceActivity {

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

        addPreferencesFromResource(R.xml.preference);
        Preference pref = findPreference("key");
        pref.getView().setVisibility(View.GONE);
            //not necessarily setVisibility, i hope you get my point
    }
}

Я нашел только этот метод: getView (представление convertView, родитель ViewGroup). Но мне кажется сбивающим с толку, что если я хочу получить представление о своих предпочтениях, мне нужно предоставить представление и группу просмотра в качестве параметров ??

Может ли кто-нибудь объяснить, как использовать этот метод, или указать мне другой метод, чтобы получить View из моего экземпляра Preference.

PS: если возможно, я бы предпочел НЕ расширять класс Preference, но я не возражаю, если это необходимо


person hendrix    schedule 08.12.2011    source источник
comment
если вместо того, чтобы скрывать, вы просто хотите отключить виджет предпочтений на основе состояния другого предпочтения, вы можете сделать это в XML с помощью android:dependency="pref_key_another_key". См. также: developer.android.com/reference/android/preference/< /а>   -  person ccpizza    schedule 05.03.2020


Ответы (3)


Я не уверен, как получить представление для предпочтения, но если вы хотите удалить представление с экрана (установите видимость на View.gone), вы можете использовать следующее:

getPreferenceScreen().removePreference(thePreference)

person Patrick    schedule 13.06.2012

Чтобы получить представление о желаемом параметре, вы можете использовать это:

@Override
public void onWindowFocusChanged(boolean hasFocus)
{
    super.onWindowFocusChanged(hasFocus);
    Preference preference=findPreference(“preferenceKey”);
    View preferenceView=getListView().getChildAt(preference.getOrder());
    //Do your stuff
}

Примечание. Вы не можете сделать это в методе onCreate, потому что он выдаст NullPointerException.

person Thunder    schedule 18.10.2015
comment
Я использую getListView.getChildCount(), который просто возвращает 0. Я не знаю, почему. - person Allen Vork; 08.06.2017
comment
@AllenVork, потому что этот код не работает ... экран предпочтений расширяется из ListView, но не хранит свои представления ... пользовательский адаптер создает новые представления при каждом onBind и не сохраняет их, поэтому вы НЕ МОЖЕТЕ ДОСТУПИТЬ К ЭТОМУ ЛЮБЫМ ОБЩЕСТВЕННЫМ СПОСОБОМ - person Rafael Lima; 09.06.2019

PreferenceActivity наследует класс ListActivity. В ListActivity есть метод getListView(), который возвращает ListView, отображающий ваши предпочтения.

EDIT: Вот код в моем комментарии в формате:

getListView().setOnItemClickListener(new AdapterView.OnItemClickListener() {
       // ... put listener code here 
});
person soren.qvist    schedule 08.12.2011
comment
Хорошо, я понимаю вашу точку зрения, и, учитывая это, есть ли лучший способ доступа к одному представлению предпочтений (не к представлению всего списка), чем тот, который описан здесь? groups.google.com/group/android-platform/browse_thread/thread/ - person hendrix; 08.12.2011
comment
Безусловно, ListView наследует AdapterView. Таким образом, вы можете подключить AdapterView.OnItemClickListener с помощью setOnItemClickListener(). Таким образом, вы можете сделать что-то вроде: getListView().setOnItemClickListener(new AdapterView.OnItemClickListener() { // ... поместите сюда код слушателя }); Я отформатировал код и поместил его в свои правки выше. - person soren.qvist; 08.12.2011
comment
привет, извините, что отвечаю с такой задержкой. В любом случае, я не думаю, что вы полностью поняли, чего я хотел достичь: активность Preference имеет listView. Этот listView представляет список предпочтений. Я так понимаю, что ListView состоит из нескольких представлений, каждое из которых представляет один элемент списка. Например, у меня есть 3 предпочтения в списке (PreferenceActivity), и я хочу установить видимость представления, представляющего первое предпочтение, на INVISIBLE. Для этого мне нужен экземпляр класса View, который назначен этому единственному предпочтению (не ListView). Итог - это не имеет ничего общего с onClick - person hendrix; 20.01.2012
comment
Вид v = (Просмотр) getListView().getItemAtPosition(1); // прежде чем делать это, убедитесь, что это представление. Затем v.setVisibility(View.GONE) - person slinden77; 27.04.2013