关于自定义单选框InfoPreference的笔记

2020-09-28 15:34:57 浏览数 (1)

1.介绍

InfoPreference实现了自定义单选项,效果如下

2.代码

2.1 Preference界面

首先InfoPreference是继承自TwPreference

代码语言:javascript复制
public class InfoPreference extends TwPreference

而TwPreference继承自RelativeLayout

代码语言:javascript复制
public abstract class TwPreference extends RelativeLayout

如果要修改Preference的那么在InfoPreference中就可以自定义我们需要的界面

对应的是preference_information.xml

2.2Preference属性

既然是自定义view,自然需要定义自己的属性AttributeSet,具体备注如下

arrts.xml中

代码语言:javascript复制
<attr name="key" format="string" />
<attr name="title" format="string" />
<attr name="summary" format="string" />
<attr name="show_value" format="boolean" />
<attr name="show_divider" format="boolean" />
<attr name="show_right_icon" format="boolean" />
<attr name="save_data" format="boolean" />
<declare-styleable name="InfoPreference">
    <attr name="key"/> 
    <attr name="title" />  这个是标题
    <attr name="summary" />  这个是提示
    <attr name="show_value"/> 这个是值
    <attr name="show_divider"/> 这个用于是否显示下划线
    <attr name="show_right_icon" /> 这个用于是否显示右边的 > 图标
    <attr name="android:entries" format="reference" /> 这个是选项标题
    <attr name="android:entryValues" format="reference" /> 这个用于是选项对应的值
    <attr name="save_data" />
</declare-styleable>

拿到属性

代码语言:javascript复制
@Override
protected void initAttribute(AttributeSet attrs){
    TypedArray typedArray = context.obtainStyledAttributes(attrs,R.styleable.InfoPreference);
     ....
}

2.3点击弹出的dialog

InfoPreference.java中showChooseDialog方法

代码语言:javascript复制
 /**点击弹出的dialog*/
    private void showChooseDialog(String title){

界面dialog_single_choose.xml

其中标题会自动引用title,其中选项使用的方法是根据entries自动添加到RadioGroup

代码语言:javascript复制
        for(int i = 0;i < dialogItems.size();i  ){
            dialogItems.get(i).setTextColor(getResources().getColor(R.color.white));
            radioGroup.addView(dialogItems.get(i));
        }

3.传值

接口方法在IPreference.java中

代码语言:javascript复制
public interface IPreference {
    boolean onPreferenceChange(TwPreference preference, Object newValue);
}

newValue就是点击后的值

这个回过来的值是android:entryValues中设置的对应的值

值回传的逻辑在showChooseDialog方法中的radioGroup点击方法内

代码语言:javascript复制
radioGroup.setOnCheckedChangeListener(new OnCheckedChangeListener(){
    @Override
    public void onCheckedChanged(RadioGroup group, int checkedId){
        try{
            RadioButton radioButton = dialogItems.get(checkedId);
            if(radioButton == null || !radioButton.isPressed()){
                return;
            }
            saveUserData(checkedId);
            if(iPreference != null){
                iPreference.onPreferenceChange(InfoPreference.this,mEntryValues[checkedId]);  //传entryValues的值出去
            }
        }catch(Exception e){
            Log.e(TAG,"onCheckedChanged: "   e.getMessage());
        }
    }
});

4.示例

代码语言:javascript复制
public class MainActivity extends AppCompatActivity implements IPreference{
    InfoPreference mIp;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mIp = findViewById(R.id.ip1);
        mIp.setOnPreferenceChangeListener(this);
        mIp.setValue("0");
    }
    @Override
    public boolean onPreferenceChange(TwPreference preference, Object newValue) {
        switch (preference.getId()){
            case R.id.ip1:
                Toast.makeText(this,"" newValue,Toast.LENGTH_LONG).show();
                break;
        }
        return false;
    }
}

使用的地方注册IPreference就行了

对应的xml

代码语言:javascript复制
<com.tw.custom.widget.InfoPreference
    android:id="@ id/ip1"
    android:key="@ id/ip1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:summary="这个是提示"
    app:show_divider="true"
    app:pref_value_icon="@drawable/ic_launcher"
    app:show_right_icon="true"
    app:title="这个是标题"
    android:entries="@array/close_open_entries"
    android:entryValues="@array/close_open_entries_value"
    />

0 人点赞