自定义带有图片的PreferenceActivity

http://my.oschina.net/huangsm/blog/40027

和大家分享一下关于android中PreferenceActivity使用以及为配置信息文件中添加图标的功能,首先给大家看一下效果图:

大家可以看到这是最终的效果图,android提供了很大的空间供开发者可以自行定义控件,你想让你的控件长成什么样子,你就可以让它长成什么样子。自己也很推崇这类开发思想,因为自行定义控件(前提:系统内置的控件满足不了自己的需求)的优点不言而喻。这边主要分享两种类型:1:单纯标题类型;2:带有复选框。

先和大家介绍一下PreferenceActivity的几种标签:系统提供的这些标签默认都是没有图片信息

Preference :没有图片单纯的文字

EditTextPreperence:带有编辑框

ListPreference:一个List集合,右边会有一个较小的向下的三角形

RingtonePreference :铃声的相关设置

其中上面的标签当中,都有android:key和android:title两个属性,如果你直接使系统内置的这些标签,其中没有任何的扩展,在通过SharedPreferences的时候对应的key便是android:key中的key,在你的应用中需要取值的时候也通过这个key来取,数据也不用开发者通过代码保存,系统自动就会保存您在设置中改变的数据。Android:key和android:title这两个属性需要在strings.xml中自行定义。

简单的介绍过后我们回过头来看看带有图片的PreferenceActivity是怎样实现。要实现带有图片的preference有两种方法;第一,使用系统内置的preference然后通过代码设置它的setLayoutResource(layoutResourceId),把layout的换成我们自己定义的layout,但是这有一种局限性就是如果有多preference个话,而且显示的图片也要不一样,那就意味着你有多少个preference就得有多少个自己定义的layout;另一种是通过继承preference来自己扩展,这样也叫灵活,不管你有多少个preference我只需要一个layout就可以搞定。

建立类为:IconOptionPreference.java继承Preference

重写构造函数,oncreateView(arg0),onBindView(arg0)这几个方法就可以,在oncreateView的代码如下:

protected View onCreateView(ViewGroup parent) {

    return LayoutInflater.from(getContext()).inflate(R.layout.app_item, parent, false);

}

你只需将自行定义的layout返回即可,接下来是绑定要显示的图片和要显示的值的问题,重写oncreateView方法,代码如下:

protected void onBindView(View view) {

super.onBindView(view);

ImageView icon = (ImageView) view.findViewById(R.id.item_image);

icon.setImageDrawable(mItemDrawable);

TextView title = (TextView) view.findViewById(R.id.item_title);

title.setText(getTitle());

}

构造函数中你只需将自己定义的属性,取出值即可。在android有结果过launcher开发的对自定义属性肯定不会陌生,代码如下:

public IconOptionPreference(Context context, AttributeSet attr){

super(context, attr);

TypedArray a = context.obtainStyledAttributes(attr, R.styleable.Preference);

int icon = a.getResourceId(R.styleable.Preference_image, 0);

mItemDrawable = context.getResources().getDrawable(icon);

a.recycle();

}

属性定义在这里就不描述了,不明白的可以留言。最后就是app_item.xml布局文件了,里面就是一个ImageView和TextView:

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="match_parent"

android:layout_height="55dip"

android:orientation="horizontal">

<ImageViewandroid:id="@+id/item_image"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:paddingLeft="15dip"

android:layout_gravity="center_horizontal|center_vertical"/>

<TextView android:id="@+id/item_title"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:textSize="22dip"

android:paddingLeft="10dip"

android:layout_gravity="center_horizontal|center_vertical"

android:textColor="@color/preference_text_color"/>

</LinearLayout>

就这样完成了一个带有图片的preference,在使用是你和其他自定义标签是一样的使用如:

<cn.yunmai.cclauncher.IconOptionPreference

android:key="@string/start_mode_key"

android:title="@string/start_mode_title"

preference:image="@drawable/prefer_modelling"/>

preference:image即为自己定义的属性,这样就完成了一个带有标签的preference了。完整的代码如下:

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

/***

 * @author huangsm

 * @date 2012-2-1

 * @email [email protected]

 * @desc custom icon of preference

 */

public class IconOptionPreference extends Preference {

   private Drawable mItemDrawable;

   public IconOptionPreference(Context context) {

      super(context);

   }

   public IconOptionPreference(Context context, AttributeSet attr){

      super(context, attr);

      TypedArray a = context.obtainStyledAttributes(attr, R.styleable.Preference);

      int icon = a.getResourceId(R.styleable.Preference_image, 0);

      mItemDrawable = context.getResources().getDrawable(icon);

       a.recycle();

   }

   public IconOptionPreference(Context context, AttributeSet attr, int defStyle){

      super(context, attr, defStyle);

      TypedArray a = context.obtainStyledAttributes(attr, R.styleable.Preference, defStyle, 0);

      int icon = a.getResourceId(R.styleable.Preference_image, 0);

      mItemDrawable = context.getResources().getDrawable(icon);

      a.recycle();

   }

   @Override

   protected void onBindView(View view) {

      super.onBindView(view);

      ImageView icon = (ImageView) view.findViewById(R.id.item_image);

      icon.setImageDrawable(mItemDrawable);   

      TextView title = (TextView) view.findViewById(R.id.item_title);

      title.setText(getTitle());

   }

    @Override

   protected View onCreateView(ViewGroup parent) {

      return LayoutInflater.from(getContext()).inflate(R.layout.app_item, parent, false);

   }

}

第二种带有复选框的你只需将布局文件中加入复选框就可以了,但是有点需要注意的是,复选框默认会获取焦点,所以你在处理点击事件的时候你的点击事件怎么样也不会生效,就是因为checkbox把焦点给抢走了,checkbox.item.xml代码如下:

<CheckBox android:id="@+id/wallpaper_ismove"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:focusable="false"

android:clickable="false"

android:layout_centerVertical="true"

android:layout_alignParentRight="true"/>

就可以了,其中android:clickable=”false”这样设置是细节上的一个问题,你可以先去掉这个属性,当你测试的时候你会发现bug。完整代码如下:

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

/***

 * @author huangsm

 * @date 2012-2-2

 * @email [email protected]

 * @desc 扩展Checkboxpreference,加入icon

 */

public class IconCheckBoxPreference extends Preference {

    private Drawable mDrawable;

   private CheckBox mCheckBox;

   private Context mContext;

   //private View mView;

   public IconCheckBoxPreference(Context context) {

      super(context);

   }

   public IconCheckBoxPreference(Context context, AttributeSet attr) {      super(context, attr);

      this.mContext = context;

      TypedArray a = context.obtainStyledAttributes(attr, R.styleable.Preference);

      int icon = a.getResourceId(R.styleable.Preference_image, 0);

      mDrawable = context.getResources().getDrawable(icon);  

      a.recycle();

   }

   public IconCheckBoxPreference(Context context, AttributeSet attr, int defStyle) {

      super(context, attr, defStyle);

      this.mContext = context;

      TypedArray a = context.obtainStyledAttributes(attr, R.styleable.Preference);

      int icon = a.getResourceId(R.styleable.Preference_image, 0);

      mDrawable = context.getResources().getDrawable(icon);

      a.recycle();

   }

   @Override

   protected void onBindView(View view) {

      super.onBindView(view);

      //绑定自定义View实现回显

      ImageView i = (ImageView) view.findViewById(R.id.wallpaper_imageView);

      i.setImageDrawable(mDrawable);

      TextView t = (TextView) view.findViewById(R.id.wallpaper_title);

      t.setText(getTitle());  

      final SharedPreferences s = PreferenceManager.getDefaultSharedPreferences(mContext);

      mCheckBox = (CheckBox) view.findViewById(R.id.wallpaper_ismove);

      mCheckBox.setChecked(s.getBoolean(getKey(), true));

   }

   @Override

   protected View onCreateView(ViewGroup parent) {

      return LayoutInflater.from(getContext()).inflate(R.layout.checkbox_item, parent, false);

   }

   //这个方法是方便在点击事件的做处理

   public CheckBox getIconCheckbox(){

      return mCheckBox;

   }

}

时间: 2024-11-05 22:00:21

自定义带有图片的PreferenceActivity的相关文章

jquery-qrcode客户端二维码生成类库扩展--融入自定义Logo图片

年后换了部门,现在主要的职责就是在网上卖精油,似乎这个就是传说中的网络营销. 跟着公司的MM们也了解不了少关于网络营销的知识,间接的了解到马云和刘强东都是些怎样龌龊的人,尽管之前也这样认为. 淘宝就不多说了,全球最大的中文假货销售平台(尽管淘宝没有打出全球中文等字样,可是其必须当之无愧).百度,当当等厚颜无耻之徒的明智之举就在于此,老外做的再大也很少会有直接支持中文的,因此他们都会在其名称前增加:“全球最大的中文”等字样,为自己镶金. 之前还一直比较力挺京东的,认为其根本自营根本不会销售假货,所

用struts2做一个带有图片效果的登陆验证码

我们在登陆网站的时候总是会有带有图片验证功能的验证码,它是怎么做出来的了,今天我就详细的将每一步步骤写出来. 1.在action层 1 package cn.itcast.javaee.js.checkcode; 2 3 import java.io.PrintWriter; 4 import javax.servlet.http.HttpServletResponse; 5 import org.apache.struts2.ServletActionContext; 6 import com

自定义圆角图片控件(Xfermode方式)

苹果都放弃自己的棱角了... 看惯了方方正正的图片,乍一看到圆角图片觉得挺漂亮的.可当满世界都是圆角图片的时候,我又开始怀念那些棱角了~之前仓促的写过一个,今天拿过来又修改了一下,现在贴在这里,以方便以后ctrl+c.ctrl+v~~~~~ 一.目标 自定义一个图片控件,有圆形和圆角两种选择.控件的行为和ImageView一致! 二.思路 扩展ImageView控件,重写其onDraw方法.一开始还想重写onMeasure方法,如果显示圆形图片强制宽高相等,没能行得通(代码中会说明).圆角图片以

自定义带图片和文字的ImageTextButton

今天我们来讲一下有关自定义控件的问题,今天讲的这篇是从布局自定义开始的,难度不大,一看就明白,估计有的同学或者开发者看了说,这种方式多此一举,但是小编我不这么认为,多一种解决方式,就多一种举一反三的学习.下一次或者过几天我会从自定义属性,在布局文件中使用属性的方式再讲一篇关于自定义控件的文章,希望对大家能够有所帮助. 现在开始讲自定义带图片和文字的ImageTextButton的实现方法. 效果图如下: 第一步:新建一个image_text_buttton.xml的布局文件,供自定义的控件使用

Android SeekBar自定义使用图片和颜色显示

      1.在res/drawable目录下新增一个xml风格文件,seekbar_define_style.xml <?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <!-- 未选中 --> <item android:id=&q

二维码(带有图片)的生成

/*************编码转换类[1]***********************/package cn.gp.tools.ErWCodeUtils; import java.io.UnsupportedEncodingException; /** * 作用:编码转换 * @author 小风微灵 * */ public class encodingFunction { public static String getMethodEncoding(String input){ try {

关于Unity实现自定义多边形图片效果

关于Unity实现自定义多边形图片效果 1.创建RawImageEditor编辑器拓展脚本(放在工程中Editor文件夹下,没有则创建) 1 /************************************************* 2 * 项目名称:动态更改图片显示边数 3 * 脚本创建人:魔卡 4 * 脚本创建时间:2018.01.27 5 * 脚本功能:RawImageEditor编辑器功能重写 6 * **************************************

自定义圆形图片

圆形图片相必是项目开发中也是不少用的一个知识点吧. 那么这里学习一下简单的制作圆形图片,主要运用 BitmapShader 类的知识来实现 一.首先,了解一下 BitmapShader 类 BitmapShader是Shader的子类,可以通过Paint.setShader(Shader shader)进行设置 看一下BitmapShader 的构造方法 BitmapShader bitmapShader = new BitmapShader(bitmap,TileMode, TileMode)

上传自定义水印图片到图片空间及保存数据库的方法

(1).添加我的水印,按钮展示: <div class="form-actions"> <button data-toggle="modal" class="sui-btn btn-primary btn-large" onclick="addmywatermark();" >添加我的水印</button> </div> /** * 添加我的水印 **/ function add