3

Ich versuche, ein Spinner Präferenz wie das zu schaffen, über bei http://www.hidroh.com/2015/11/30/building-custom-preferences-v7/Individuelle Vorlieben Stil padding Problem

Bisher habe ich verlängert Präferenz wie folgt aus:

public class SpinnerPreference extends Preference { 
    protected String[] mEntries = new String[0]; 
    protected String[] mEntryValues = new String[0]; 
    private int mSelection = 0; 

    private final LayoutInflater mLayoutInflater; 

    public SpinnerPreference(Context context, AttributeSet attrs) { 
     this(context, attrs, 0); 
    } 

    public SpinnerPreference(Context context, AttributeSet attrs, int defStyleAttr) { 
     super(context, attrs, defStyleAttr); 
     setWidgetLayoutResource(R.layout.spinner_preference); 
     mLayoutInflater = LayoutInflater.from(getContext()); 
     init(context, attrs); 

    } 

    private void init(Context context, AttributeSet attrs) { 
     TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.SpinnerPreference); 
     int entriesResId = ta.getResourceId(R.styleable.SpinnerPreference_entries, 0); 
     if (entriesResId != 0) { 
      mEntries = context.getResources().getStringArray(entriesResId); 
     } 
     int valuesResId = ta.getResourceId(R.styleable.SpinnerPreference_entryValues, 0); 
     if (valuesResId != 0) { 
      mEntryValues = context.getResources().getStringArray(valuesResId); 
     } 
     ta.recycle(); 
    } 

    @Override 
    protected Object onGetDefaultValue(TypedArray a, int index) { 
     return a.getString(index); 
    } 

    @Override 
    protected void onSetInitialValue(boolean restorePersistedValue, Object defaultValue) { 
     super.onSetInitialValue(restorePersistedValue, defaultValue); 
     String value = restorePersistedValue ? getPersistedString(null) : (String) defaultValue; 
     for (int i = 0; i < mEntryValues.length; i++) { 
      if (TextUtils.equals(mEntryValues[i], value)) { 
       mSelection = i; 
       break; 
      } 
     } 
    } 

    @Override 
    public void onBindViewHolder(PreferenceViewHolder holder) { 
     super.onBindViewHolder(holder); 
     final Spinner spinner = (Spinner) holder.findViewById(R.id.spinner); 
     holder.itemView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       spinner.performClick(); 
      } 
     }); 
     spinner.setAdapter(new SpinnerAdapter() { 
      @Override 
      public View getDropDownView(int position, View convertView, ViewGroup parent) { 
       if (convertView == null) { 
        convertView = createDropDownView(position, parent); 
       } 
       bindDropDownView(position, convertView); 
       return convertView; 
      } 

      @Override 
      public void registerDataSetObserver(DataSetObserver observer) { 
       // no op 
      } 

      @Override 
      public void unregisterDataSetObserver(DataSetObserver observer) { 
       // no op 
      } 

      @Override 
      public int getCount() { 
       return mEntries.length; 
      } 

      @Override 
      public Object getItem(int position) { 
       return null; // not applicable 
      } 

      @Override 
      public long getItemId(int position) { 
       return position; 
      } 

      @Override 
      public boolean hasStableIds() { 
       return true; 
      } 

      @Override 
      public View getView(int position, View convertView, ViewGroup parent) { 
       return getDropDownView(position, convertView, parent); 
      } 

      @Override 
      public int getItemViewType(int position) { 
       return 0; 
      } 

      @Override 
      public int getViewTypeCount() { 
       return 1; 
      } 

      @Override 
      public boolean isEmpty() { 
       return false; 
      } 
     }); 
     spinner.setSelection(mSelection); 
     spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 
      @Override 
      public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { 
       mSelection = position; 
       persistString(mEntryValues[position]); 
      } 

      @Override 
      public void onNothingSelected(AdapterView<?> parent) { 
       // no op 
      } 
     }); 
    } 

    protected View createDropDownView(int position, ViewGroup parent) { 
     return mLayoutInflater.inflate(R.layout.spinner_pref_dropdown, parent, false); 
    } 

    /** 
    * Customize dropdown view for given spinner item 
    * @param position item position 
    * @param view  item view 
    */ 
    protected void bindDropDownView(int position, View view) { 
     TextView textView = (TextView) view.findViewById(android.R.id.text1); 
     textView.setText(mEntries[position]); 
    } 
} 

Dies führt jedoch in der folgenden :

Wenn Sie den "Server" Titel sieht anders sehen als der Rest Präferenzen, auch wenn ich seinen Stil nicht berühre. Polsterung ist auch sehr unterschiedlich. Warum passiert das und wie kann ich dieses Styling ändern?

Auch im gleichen Bild können Sie ein Symbol sehen, ist es möglich, dieses Symbol an der Spitze auszurichten?

Preference XML:

<android.support.v7.preference.PreferenceScreen 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto"> 


    <android.support.v7.preference.ListPreference 
     android:key="prefs-preferred-quality" 
     android:icon="@drawable/ic_soccer" 
     android:summary="Bitrate determines the quality of the stream. Auto is recommended." 
     android:title="Streaming bitrate"/> 


     <android.support.v7.preference.SwitchPreferenceCompat 
     android:defaultValue="false" 
     android:key="prefs-record-locally" 
     android:summary="Should videos also be saved to the device?" 
     android:title="Record Locally"/> 


    <tv.mycujoo.mycujoobroadcast.settings.preferences.SpinnerPreference 
     android:key="prefs-preferred-server" 
     android:icon="@drawable/ic_record_dark" 
     app:entries="@array/stream_bitrate" 
     app:entryValues="@array/stream_bitrate_values" 
     android:summary="Streaming region to stream to" 
     android:title="Server"/> 


</android.support.v7.preference.PreferenceScreen> 

EDIT: Ich stellte einen Beispielcode mit nur diesem Bildschirm präsentiert beide Probleme:

https://github.com/kelmer44/prefs-test

+0

Können Sie ein einfaches Projekt auf Github mit diesem Verhalten veröffentlichen? – azizbekian

+0

Ich tat das nur @azizbekian – MichelReap

Antwort

1

Ich hatte das gleiche Problem und veröffentlicht die Antwort in diesem Beitrag :

Custom Preference shows differently on Preference screen than native Preferences

Es wird Ihr Problem lösen.

In Ihrem Code verschieben Sie einfach den Code aus dem Konstruktor mit 3 Argumenten in den Konstruktor mit 2 Argumenten (Aufruf super(context, attrs);) und löschen Sie den Konstruktor mit 3 Argumenten, die Basisklasse Preference wählt den richtigen Stil für Sie.

+0

das war eine sofortige Lösung, danke. Hast du auch eine Idee, wie man die Icons positioniert? – MichelReap

+0

In ein paar Worten. Das Layout wird vom System aus dem SDK unter ** \ platforms \ android- \ data \ res \ layout \ preferences.xml ** übernommen. Sie können es in Ihren 'Layout'-Ordner kopieren und das Symbol, die Ausrichtung usw. anpassen. Aber ich würde das nicht empfehlen, denn in zukünftigen Versionen könnte sich die ursprüngliche' Präferenz' ändern und Sie werden mit Ihrem benutzerdefinierten Layout hängen bleiben. – ilomambo