3

我想在在 http://www.hidroh.com/2015/11/30/building-custom-preferences-v7/定製偏好風格填充問題

創建一個微調偏好像一個到目前爲止,我已經擴展偏好這樣的:

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]); 
    } 
} 

然而,這將導致以下:

正如你可以看到「服務器」的稱號看起來比其他地區不同偏好,即使我沒有觸及它的風格。填充是非常不同的。爲什麼會發生這種情況,我該如何修改這種樣式?

此外,在同一圖像中,您可以看到一個圖標,是否可以將此圖標與頂部對齊?

偏好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> 

編輯:我張貼的樣本代碼只是這個畫面展示了兩個問題:

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

+0

你可以在github上發佈一個簡單的項目嗎? – azizbekian

+0

我剛剛做了@azizbekian – MichelReap

回答

1

我有同樣的問題,並張貼答案在這個崗位:

Custom Preference shows differently on Preference screen than native Preferences

它會解決你的問題。

在你的代碼只是移動從3參數的構造函數的2參數的構造函數的代碼(調用super(context, attrs);),並刪除3參數的構造函數,基類Preference會選擇合適的款式適合你。

+0

這是一個即時修復,謝謝。你也有關於如何定位圖標的想法嗎? – MichelReap

+0

用幾句話。系統從您的SDK在** \ platforms \ android- \ data \ res \ layout \ preferences.xml **下采用佈局。您可以將它複製到您的'layout'文件夾並自定義圖標,對齊方式等。但我不建議這樣做,因爲在將來的版本中,原來的'preference'可能會改變,您將被自定義佈局填充。 – ilomambo