setOnPreferenceChangeListener не работает для пользовательских настроек флажка - PullRequest
0 голосов
/ 26 октября 2011

Я сделал простое расширение CheckBoxPreference, чтобы у меня мог быть собственный настраиваемый вид со значком изображения слева от заголовка. Код ниже:

public class CustomCheckBoxPreference extends CheckBoxPreference {

private Drawable icon;

public CustomCheckBoxPreference(Context context, AttributeSet attrs) {
    super(context, attrs);
    TypedArray arr = context.obtainStyledAttributes(attrs, R.styleable.CustomCheckBoxPreference, 0, 0);
    icon = arr.getDrawable(R.styleable.CustomCheckBoxPreference_icon);
    setLayoutResource(R.layout.custom_checkbox_pref);
}

@Override
protected void onBindView(View view) {
    super.onBindView(view);
    ImageView prefsIcon = (ImageView) view.findViewById(R.id.prefs_icon);
    prefsIcon.setImageDrawable(icon);
}

Проблема в том, что по какой-то причине OnPreferenceChangeListener I, установленный на любое значение CustomCheckboxPreference, не имеет никакого эффекта и не сохраняется. Я попытался переопределить некоторые из методов Android для реализации, вызвав super, а затем распечатав строку, чтобы увидеть, что вызывается. Примечательно, что callChangeListener не вызывают. Именно этот метод приводит к обратному вызову для onPreferenceChanged. Я попытался вызвать onPreferenceChanged внутри setChecked, чтобы посмотреть, что произойдет, и OnPreferenceChangeListener будет нулевым:

            getOnPreferenceChangeListener().onPreferenceChange(this, checked);

Вот как я устанавливаю preferencechangelistener:

        mTwitterPref.setChecked(!mTwitter.needsAuth());
    mTwitterPref.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
        @Override
        public boolean onPreferenceChange(Preference preference, Object newValue) {
            System.out.println("Twitter Preference Changed!");
            if ((Boolean) newValue) {
                if (mTwitter.needsAuth()) {
                    System.out.println("We Need To Login To Twitter!");
                    IntentUtils.startActivityForResult(ProfileAccountsActivity.this,
                            TwLoginActivity.class, ACTIVITY_OAUTH);
                }
            } else {
              showDialog(DIALOG_LOGOUT_TWITTER);
            }
            return false;
        }
    });

Я немного смущен тем, почему preferencechangelistener не работает должным образом, поскольку я перезаписываю только onBindView и конструктор; Я называю супер в обоих. Есть мысли?

Ответы [ 3 ]

4 голосов
/ 01 ноября 2011

Установить android: focusable = "false" и android: clickable = "false" в CheckBox:

<CheckBox
    android:id="@+android:id/checkbox"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" 
    android:focusable="false"
    android:clickable="false" />

Дополнительная информация по этой теме: Кликабельные строки в пользовательском ArrayAdapter

0 голосов
/ 14 февраля 2018

Я нашел решение!В моем случае я расширяю DialogPreference на свой пользовательский класс Dialog,

public class SvDialogPreference extends DialogPreference

Я также путаю, потому что в PreferenceFragment onPreferenceChange никогда не работал.

SvDialogPreference pref= (SvDialogPreference) findPreference("mainKey");
if( pref != null ) {
pref.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
// Never execute !
}}

Чтобы решить эту проблему.Я вызвал «super.callChangeListener» в onDialogClosed.

public class SvDialogPreference extends DialogPreference{
....
@Override
protected void onDialogClosed(boolean positiveResult) {

double InputValue = Double.parseDouble(KEY.getText().toString());
     super.callChangeListener(InputValue);
     super.onDialogClosed(positiveResult);
}

Теперь onPreferenceChange работает отлично!

0 голосов
/ 22 июня 2015

У меня была такая же проблема с пользовательской кнопкой.Я попробовал решение, предоставленное @jeanh, и оно работает.Но моя кнопка не была нажата, выделена только область вокруг нее.Более того, что если у вас есть несколько кнопок?Очевидно, что это решение не будет работать.Итак, я решил копнуть глубже, и мое решение было ниже:

xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/widget_frame" android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:paddingLeft="15dp"
android:paddingTop="5dp"
android:paddingRight="10dp"
android:paddingBottom="5dp"    
>
<!-- define my button -->
<Button android:id="@android:id/title"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:textSize="17sp"
        android:typeface="sans"
        android:textStyle="bold"
        android:textColor="#000000"
></Button>    

</RelativeLayout>

Класс Java:

public class ButtonPreference extends Preference {

    private final String TAG = getClass().getName();

    public interface ButtonListener {      
        public void onCustomClick();
    }

    public ButtonListener buttonListener;

    public void setButtonListener(ButtonListener buttonListener){
        this.buttonListener = buttonListener;
    }

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

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

    @Override
    protected View onCreateView(ViewGroup parent){

        RelativeLayout layout =  null;

        try {
            LayoutInflater mInflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            layout = (RelativeLayout)mInflater.inflate(R.layout.button_preference, parent, false);
            //FIND OUR BUTTON IN LAYOUT
            Button button = (Button) layout.findViewById(android.R.id.title);
            if(button!=null){
            Log.e(TAG, "button found");
            button.setOnClickListener(new OnClickListener() {                   
                @Override
                public void onClick(View v) {                       
                    if(buttonListener!=null){                           
                        buttonListener.onCustomClick(); //INVOKE OUR EVENT!
                    }
                }
            });
            }            
       }
       catch(Exception e)
       {
           Log.e(TAG, "Error creating info preference", e);
       }        
       return layout;        
   }    
}

КАК ИСПОЛЬЗОВАТЬ ЭТО?Просто!

public class WallpaperSettings extends PreferenceActivity {

protected void onCreate(Bundle savedInstanceState) {        
    super.onCreate(savedInstanceState);
    addPreferencesFromResource(R.xml.prefs);    

    ButtonPreference defaultSettingsButton = (ButtonPreference) findPreference(EngineCore.pref+"defaultSettings");      
    defaultSettingsButton.setButtonListener(new ButtonListener() {          
        @Override
        public void onCustomClick() {
            Gdx.app.log("ButtonListener", "onCustomClick");             
        }
    });
}   
}

Надеюсь, это поможет кому-то еще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...