前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >关于自定义单选框InfoPreference的笔记

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

作者头像
项勇
发布2020-09-28 15:34:57
4830
发布2020-09-28 15:34:57
举报
文章被收录于专栏:项勇项勇

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"
    />
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-09-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 项勇 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档