2012-07-21 64 views
0

我在PreferenceActivity中有一个EditPreference,我有一个变量告诉我是否应允许用户访问此首选项或显示某些警报。Android首选项 - 替换首选项功能

我的问题是,我找不到如何取消首选项对话框,并显示我的警报(根据变量)。

我试图在首选项onClickonTreeClick中返回true/false,但那没做任何事,对话框仍然弹出。

在Android 2.1+上。

谢谢。

回答

2

DialogPreference.onClick()处理对首选项本身的点击是protected,所以你不能在你自己的PreferenceActivity类成员中覆盖它。

但是,您可以扩展该类以实现您所需的功能。下面是一个非常简约的例子:

package com.example.test; 

import android.content.Context; 
import android.preference.EditTextPreference; 
import android.util.AttributeSet; 

public class MyEditTextPreference extends EditTextPreference { 

    private Runnable alternative = null; 

    public MyDatePickerDialog(Context context, 
      AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
    } 

    public MyDatePickerDialog(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    public MyDatePickerDialog(Context context) { 
     super(context); 
    } 

    public void setAlternativeRunnable(Runnable runnable) { 
     alternative = runnable; 
    } 

    // this will probably handle your needs 
    @Override 
    protected void onClick() { 
     if (alternative == null) super.onClick(); 
     else alternative.run(); 
    } 

} 

在XML文件中:

<com.example.test.MyEditTextPreference 
     android:key="myCustom" 
     android:title="Click me!" /> 

在你PreferenceActivity

MyEditTextPreference pref = (MyEditTextPreference) this.findPreference("myCustom"); 
pref.setAlternativeRunnable(new Runnable() { 
    @Override 
    public void run() { 
     Toast.makeText(getApplication(), "Canceled!", Toast.LENGTH_SHORT) 
       .show(); 
    } 
}); 

最后要注意,让我说,只要你无法找到你想要的方法,想想看看Android类自己的工作方式。大多数时候,他们会给你很好的见解,以达到你想要的。

在这种情况下,它是DialogInterface.onClick()方法,如上所述。所以你知道你需要重写它以达到目的。在这种情况下,解决方案正在扩展EditTextPreference类本身。

+0

顺便说一句,你肯定可以改善与标志等。这只是一个例子。 – davidcesarino 2012-07-21 15:39:08