2014-10-03 3 views
1

Я работаю над экраном настроек, и я использую API предпочтений Android для создания интерфейса. Одним из предпочтений будет кнопка - и я сделал это, добавив пользовательский макет к предпочтению. Он работает - кнопка отображается так, как я ее хочу, но проблема в том, что при установке OnPreferenceClickListener ничего не происходит. Это не срабатывает.Пользовательские предпочтения - кнопка не нажата

Я попытался добавить beforeDescendants в корень макета кнопки, но не повезло. Также попытался добавить фокусное ложное к кнопке, но все равно не повезло.

Может ли кто-нибудь поделиться некоторыми советами о том, как я могу настроить кнопку предпочтения? Спасибо!

+0

Вы проверили [это] (http://stackoverflow.com/questions/16449372/onpreferenceclick-and-onpreferenceclicklistener) ответ? –

+0

Я не знаю, как это связано? – Alin

+1

«Вы должны зарегистрироваться для PreferenceClickListener для каждого индивидуального предпочтения somePreference.setOnPreferenceClickListener (this);" Я бы также предложил разместить ваш код –

ответ

3

onPreferenceClick запускается, когда нажатие кнопки предпочтения не было нажато. Если вы хотите поймать кнопку, вам нужно установить OnClickListener на самой кнопке. Проблема заключается в том, чтобы восстановить надутую кнопку, поскольку класс Preference не имеет метода findViewById или чего-либо подобного. Вот как я это сделать:

  1. Создание пользовательского класса предпочтений и переопределить onCreateView
  2. В методе onCreateView вы захватить завышенные макет из суперкласса и найти кнопку
  3. Добавить OnClickListener в кнопка
  4. Используйте свой собственный класс предпочтений в файле макета привилегированной

public class CustomPreference extends Preference { 

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

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

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

    @Override 
    protected View onCreateView(ViewGroup parent) { 
     View preferenceView = super.onCreateView(parent); 

     setOnClickListener(preferenceView); 

     return preferenceView; 
    } 

    private void setOnClickListener(View preferenceView) { 
     if (preferenceView != null && preferenceView instanceof ViewGroup) { 
      ViewGroup widgetFrameView = ((ViewGroup)preferenceView.findViewById(android.R.id.widget_frame)); 
      if (widgetFrameView != null) { 
       // find the button 
       Button theButton = null; 
       int count = widgetFrameView.getChildCount(); 
       for (int i = 0; i < count; i++) { 
        View view = widgetFrameView.getChildAt(i); 
        if (view instanceof Button) { 
         theButton = (Button)view; 
         break; 
        } 
       } 

       if (theButton != null) { 
        // set the OnClickListener 
        theButton.setOnClickListener(new OnClickListener() { 
         @Override 
         public void onClick(View v) { 
          // do whatever you want to do 
         } 
        }); 
       } 
      } 
     } 
    } 
} 

Это заменяет Выбираю в файле XML:

<yourpackage.CustomPreference 
    android:key="your_id" 
    android:title="@string/your_title" 
    android:summary="@string/your_summary"/> 
0

Я хотел бы использовать что-то похожее на код ниже, чтобы осуществить это:

@Override 
protected View onCreateView (ViewGroup parent) { 
    LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    View customRow = inflater.inflate(R.layout.preferences_station_list_row, null); 
    ((ImageButton) customRow.findViewById(R.id.pref_delete_station)).setOnClickListener(new OnClickListener() {  
     @Override 
     public void onClick(View v) { 
      //perform whatever you need to button to do here. 
     } 
    }); 

    customRow.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      showDialog(null); 
     } 
    }); 
    customRow.setClickable(true); 
    return customRow; 
} 

ли это решить проблему?

0

переопределять значение 'onClick()' от Preference метода и убедитесь, что ваш пользовательский макет НЕ имеет:

android:clickable="true" 

Вам не нужно ничего особенного, но если ваш макет содержит вид с a ndroid: clickable = "true" это беспорядок полностью.

Смежные вопросы