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"
/>