Android在PreferenceActivity中获取Preference视图

15
我想要获取用于在我的PreferenceActivity中显示特定Preference的View实例,以便我可以修改它的属性,例如:
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 (View convertView, ViewGroup parent)。但是如果我想获取我的首选项视图,为什么需要提供视图和视图组作为参数?有人可以解释一下如何使用这个方法吗,或者指向另一个从我的Preference实例获取View的方法。注:如果可能的话,我宁愿不扩展Preference类,但如果必要,我也不介意。

1
如果您不是要隐藏,而是根据另一个偏好设置的状态禁用偏好设置窗口小部件,则可以在XML中使用android:dependency =“pref_key_another_key”来实现。请参见:https://developer.android.com/reference/android/preference/Preference#attr_android:dependency - ccpizza
3个回答

6
为了得到所需首选项的视图,您可以使用以下方法:
@Override
public void onWindowFocusChanged(boolean hasFocus)
{
    super.onWindowFocusChanged(hasFocus);
    Preference preference=findPreference(“preferenceKey”);
    View preferenceView=getListView().getChildAt(preference.getOrder());
    //Do your stuff
}

注意: 你不能在onCreate方法中这样做,因为它会抛出NullPointerException异常。


2
我使用getListView.getChildCount(),但它只返回0。我不知道为什么。 - Allen Vork
@AllenVork,因为这段代码不起作用... preferencescreen继承自ListView,但它不存储其视图...自定义适配器在每个onBind中创建新的视图,并且不保留它们,所以你无法通过任何公共方法访问它们。 - Rafael Lima

4
PreferenceActivity继承了ListActivity类。ListActivity有一个名为getListView()的方法,该方法返回显示您的偏好设置的ListView。

编辑:这是我评论中格式化的代码:

getListView().setOnItemClickListener(new AdapterView.OnItemClickListener() {
       // ... put listener code here 
});

好的,我明白你的观点。考虑到这一点,有没有更好的方法来访问单个首选项视图(而不是整个列表视图),而不是在这里描述的方法?http://groups.google.com/group/android-platform/browse_thread/thread/b70c317a2804128b - hendrix
当然,ListView继承自AdapterView。因此,您可以使用setOnItemClickListener()附加一个AdapterView.OnItemClickListener。所以你可以做这样的事情:getListView().setOnItemClickListener(new AdapterView.OnItemClickListener() { // ... put listener code here }); 我已经格式化了代码并将其放在我的编辑中。 - soren.qvist
1
你好,很抱歉回复晚了。无论如何,我认为你没有完全理解我的意图:Preference Activity有一个ListView。这个ListView代表了一系列的偏好设置。我理解它,即ListView由几个视图组成,每个视图代表单个列表项。例如,我在列表中有3个偏好设置(PreferenceActivity),我想将代表第一个偏好设置的视图的可见性设置为INVISIBLE。为此,我需要View类的实例,该实例分配给该单个偏好设置(而不是ListView)。底线-这与onClick没有任何关系。 - hendrix
1
View v = (View) getListView().getItemAtPosition(1); // 在执行此操作之前,请确保它是一个视图。然后 v.setVisibility(View.GONE)。 - slinden77

1

我不确定如何获取首选项的视图,但如果您想要从屏幕中删除该视图(将可见性设置为View.gone),则可以使用以下代码:

getPreferenceScreen().removePreference(thePreference)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接