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