2015-01-29 1 views
1

Я недавно познакомился с PreferenceActivity и хотел бы изменить, как я обрабатываю взаимодействие с EditTextPreference, определенным в xml.Может ли PreferenceActivity настроить, как он обрабатывает касания?

Я поставил журналы, тосты и точки останова, где шаблон перекрыл onListItemClick(, но ничего не возвращается ко мне. Я даже попытался войти в суперкласс и смог установить контрольные точки на if и return успешно, хотя они не были в конечном счете захвачены.

protected void onListItemClick(ListView l, View v, int position, long id) { 
    if (!isResumed()) { 
     return; 
    } 
    super.onListItemClick(l, v, position, id); 

Спасибо для смотреть

EDIT @DanielLe, вот мой код:

//This isn't getting called?! 
@Override 
protected void onListItemClick(ListView l, View v, int position, long id) { 
    String selection = l.getItemAtPosition(position).toString(); 
    Toast.makeText(this, selection, Toast.LENGTH_LONG).show(); 
    Log.d("Activity", "onListItemClick=" + l.getItemAtPosition(position).toString()); 
    super.onListItemClick(l, v, position, id); 
} 
+0

Вы сказал, что вы ставили журналы , тосты и точки останова, но ваш образец кода не содержит ничего. Не могли бы вы обновить образец кода? Во всяком случае, ваш текущий образец кода просто вызывает метод суперкласса, поэтому он будет иметь поведение по умолчанию. И предложение if необязательно, потому что пользовательский ввод не переходит к вашей активности, если он не находится в состоянии возобновления. См. [Жизненный цикл Android-активности] (https://developer.android.com/reference/android/app/Activity.html). –

+0

@ DanielLe Образец кода от суперкласса, 'PreferenceActivity' – John

+0

Тогда вы можете указать свой код? –

ответ

1

Рискуя повторить то, что пошло прежде, одно решение продлить DialogPreferences, как описано в руководство Google для Android dev. Это только показывает нормально и отменить кнопки, которые я считаю делает это минимум для сохраняющеесяDialogPreferences реализация:

Android: Creating custom preference

import android.content.Context; 
import android.content.DialogInterface; 
import android.os.Parcel; 
import android.os.Parcelable; 
import android.preference.DialogPreference; 
import android.preference.EditTextPreference; 
import android.util.AttributeSet; 
import android.widget.Button; 
import android.widget.EditText; 

public class ClickablePreference extends DialogPreference { 
    private String mNewValue; 
    private EditText mEditText; 

    public ClickablePreference(Context context, AttributeSet attrs) { 
     super(context, attrs); 

     setDialogLayoutResource(R.layout.dir_picker_dialog); 
     setPositiveButtonText(android.R.string.ok); 
     setNegativeButtonText(android.R.string.cancel); 

     setDialogIcon(null); 
    } 

    @Override 
    protected void onDialogClosed(boolean positiveResult) { 
     // When the user selects "OK", persist the new value 
     if (positiveResult) { 
      persistString(mNewValue); 
     } 
    } 

    private static class SavedState extends BaseSavedState { 
     // Member that holds the setting's value 
     // Change this data type to match the type saved by your Preference 
     String value; 

     public SavedState(Parcelable superState) { 
      super(superState); 
     } 

     public SavedState(Parcel source) { 
      super(source); 
      // Get the current preference's value 
      value = source.readString(); // Change this to read the appropriate data type 
     } 

     @Override 
     public void writeToParcel(Parcel dest, int flags) { 
      super.writeToParcel(dest, flags); 
      // Write the preference's value 
      dest.writeString(value); // Change this to write the appropriate data type 
     } 

     // Standard creator object using an instance of this class 
     public static final Parcelable.Creator<SavedState> CREATOR = 
       new Parcelable.Creator<SavedState>() { 

        public SavedState createFromParcel(Parcel in) { 
         return new SavedState(in); 
        } 

        public SavedState[] newArray(int size) { 
         return new SavedState[size]; 
        } 
       }; 
    } 

    @Override 
    protected void onSetInitialValue(boolean restorePersistedValue, Object defaultValue) { 
     if (restorePersistedValue) { 
      // Restore existing state 
      mNewValue = this.getPersistedString(""); 
     } else { 
      // Set default state from the XML attribute 
      mNewValue = (String) defaultValue; 
      persistString(mNewValue); 
     } 
    } 

    @Override 
    protected Parcelable onSaveInstanceState() { 
     final Parcelable superState = super.onSaveInstanceState(); 
     // Check whether this Preference is persistent (continually saved) 
     if (isPersistent()) { 
      // No need to save instance state since it's persistent, 
      // use superclass state 
      return superState; 
     } 

     // Create instance of custom BaseSavedState 
     final SavedState myState = new SavedState(superState); 
     // Set the state's value with the class member that holds current 
     // setting value 
     myState.value = mNewValue; 
     return myState; 
    } 

    @Override 
    protected void onRestoreInstanceState(Parcelable state) { 
     // Check whether we saved the state in onSaveInstanceState 
     if (state == null || !state.getClass().equals(SavedState.class)) { 
      // Didn't save the state, so call superclass 
      super.onRestoreInstanceState(state); 
      return; 
     } 

     // Cast state to custom BaseSavedState and pass to superclass 
     SavedState myState = (SavedState) state; 
     super.onRestoreInstanceState(myState.getSuperState()); 

     // Set this Preference's widget to reflect the restored state 
     mEditText.setText(myState.value); 
    } 

    @Override 
    protected void onClick() { 
     super.onClick(); 
    } 

    @Override 
    public void onClick(DialogInterface dialog, int which) { 
     super.onClick(dialog, which); 
    } 
} 

Я еще смотреть на Concise way of writing new DialogPreference classes? подробно, хотя, кажется, очень похож на что я получил от Google.

Проблема с этим решением, кроме его размера, заключается в том, что mEditText не используется, и я не мог на самом деле получить ссылку на отображаемый EditText, определенный в xml.


Ролл на решение 2

С благодаря Android: launch a custom Preference from a PreferenceActivity

пометил это на конце onPostCreate от MyPreferenceActivity

protected void onPostCreate(Bundle savedInstanceState) { 
    super.onPostCreate(savedInstanceState); 
    setupSimplePreferencesScreen(); 
    Preference customPref = (Preference) findPreference("pref_do_something"); 
    customPref.setOnPreferenceClickListener(
      new Preference.OnPreferenceClickListener() { 
       public boolean onPreferenceClick(Preference preference) { 
        Log.d("Activity", "onPreferenceClick=" + preference.toString()); 
        return true; 
       } 
      }); 
} 

Гораздо лучше :)