zoukankan      html  css  js  c++  java
  • Android 标签控件

    版本号:1.0
    日期:2014.7.24
    版权:© 2014 kince 转载注明出处
      
      在有的应用中可能须要设置一些标签来方便用去去查询某些信息,比方手机助手或者购物软件之类都会有一些标签。对于软件开发初期来说,直接使用TextView、Button实现是最为简单的一种方式。可是这样的方法也有其局限性,比方不能控制换行、耦合性低等缺点。所以除了解决这些问题之外,最好能够封装一个类库出来,方便以后使用。
      首先新建一个Tag类,
    import java.io.Serializable;
    
    public class Tag implements Serializable {
         
          /**
          *
          */
          private static final long serialVersionUID = 2684657309332033242L;
         
          private int backgroundResId ;
          private int id ;
          private boolean isChecked ;
          private int leftDrawableResId ;
          private int rightDrawableResId ;
          private String title;
    
          public Tag() {
              
         }
    
          public Tag( int paramInt, String paramString) {
               this .id = paramInt;
               this .title = paramString;
         }
    
          public int getBackgroundResId() {
               return this .backgroundResId ;
         }
    
          public int getId() {
               return this .id ;
         }
    
          public int getLeftDrawableResId() {
               return this .leftDrawableResId ;
         }
    
          public int getRightDrawableResId() {
               return this .rightDrawableResId ;
         }
    
          public String getTitle() {
               return this .title ;
         }
    
          public boolean isChecked() {
               return this .isChecked ;
         }
    
          public void setBackgroundResId( int paramInt) {
               this .backgroundResId = paramInt;
         }
    
          public void setChecked( boolean paramBoolean) {
               this .isChecked = paramBoolean;
         }
    
          public void setId(int paramInt) {
               this .id = paramInt;
         }
    
          public void setLeftDrawableResId( int paramInt) {
               this .leftDrawableResId = paramInt;
         }
    
          public void setRightDrawableResId( int paramInt) {
               this .rightDrawableResId = paramInt;
         }
    
          public void setTitle(String paramString) {
               this .title = paramString;
         }
    }
    
      这个类封装了标签视图的背景图片资源、id、是否check等。
      然后新建TagView类,继承自ToggleButton,
    import com.niceapp.lib.tagview.R;
    
    import android.content.Context;
    import android.util.AttributeSet;
    import android.widget.ToggleButton;
    
    public class TagView extends ToggleButton {
         
          private boolean mCheckEnable = true;
    
          public TagView(Context paramContext) {
               super (paramContext);
              init();
         }
    
          public TagView(Context paramContext, AttributeSet paramAttributeSet) {
               super (paramContext, paramAttributeSet);
              init();
         }
    
          public TagView(Context paramContext, AttributeSet paramAttributeSet,
                   int paramInt) {
               super (paramContext, paramAttributeSet, 0);
              init();
         }
    
          private void init() {
              setTextOn( null );
              setTextOff( null );
              setText( "" );
              setBackgroundResource(R.drawable. tag_bg );
         }
    
          public void setCheckEnable( boolean paramBoolean) {
               this .mCheckEnable = paramBoolean;
               if (!this .mCheckEnable ) {
                   super .setChecked( false);
              }
         }
    
          public void setChecked( boolean paramBoolean) {
               if (this .mCheckEnable ) {
                   super .setChecked(paramBoolean);
              }
         }
    }
    
     这个TagView就是标签视图,标签信息由他来显示。对应的xml文件例如以下,tag.xml:
    <? xml version= "1.0" encoding = "utf-8"?>
    < com.niceapp.lib.tagview.widget.TagView xmlns:android ="http://schemas.android.com/apk/res/android"
        android:layout_width= "wrap_content"
        android:layout_height= "wrap_content"
        android:drawablePadding= "5.0dip"
        android:minHeight= "0.0dip"
        android:paddingBottom= "4.5dip"
        android:paddingLeft= "20.0dip"
        android:paddingRight= "20.0dip"
        android:paddingTop= "4.5dip"
        android:textColor= "#ff000000"
        android:textSize= "16.0sp" />
    
    显演示样例如以下:
     
     在github上有一个android-flowlayout控件,它是依据子视图的大小来动态包裹视图,如图:

     
      因此,控制换行就能够利用这个控件去实现,无需反复发明轮子。android-flowlayout功能实现的类是FlowLayout,所以通过继承这个类来完毕标签控件的实现。
    import java.util.ArrayList;
    import java.util.List;
    import com.niceapp.lib.tagview.R;
    import android.content.Context;
    import android.util.AttributeSet;
    import android.util.TypedValue;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.CompoundButton;
    
    /**
    * @author kince
    * 
    */
    public class TagListView extends FlowLayout implements OnClickListener {
    
         private boolean mIsDeleteMode;
         private OnTagCheckedChangedListener mOnTagCheckedChangedListener;
         private OnTagClickListener mOnTagClickListener;
         private int mTagViewBackgroundResId;
         private int mTagViewTextColorResId;
         private final List<Tag> mTags = new ArrayList<Tag>();
    
         /**
         * @param context
         */
         public TagListView(Context context) {
              super(context);
              // TODO Auto-generated constructor stub
              init();
         }
    
         /**
         * @param context
         * @param attributeSet
         */
         public TagListView(Context context, AttributeSet attributeSet) {
              super(context, attributeSet);
              // TODO Auto-generated constructor stub
              init();
         }
    
         /**
         * @param context
         * @param attributeSet
         * @param defStyle
         */
         public TagListView(Context context, AttributeSet attributeSet, int defStyle) {
              super(context, attributeSet, defStyle);
              // TODO Auto-generated constructor stub
              init();
         }
    
         @Override
         public void onClick(View v) {
              if ((v instanceof TagView)) {
                   Tag localTag = (Tag) v.getTag();
                   if (this.mOnTagClickListener != null) {
                        this.mOnTagClickListener.onTagClick((TagView) v, localTag);
                   }
              }
         }
    
         private void init() {
    
         }
    
         private void inflateTagView(final Tag t, boolean b) {
    
              TagView localTagView = (TagView) View.inflate(getContext(),
                        R.layout.tag, null);
              localTagView.setText(t.getTitle());
              localTagView.setTag(t);
    
              if (mTagViewTextColorResId <= 0) {
                   int c = getResources().getColor(R.color.blue);
                   localTagView.setTextColor(c);
    
              }
    
              if (mTagViewBackgroundResId <= 0) {
                   mTagViewBackgroundResId = R.drawable.tag_bg;
                   localTagView.setBackgroundResource(mTagViewBackgroundResId);
              }
    
              localTagView.setChecked(t.isChecked());
              localTagView.setCheckEnable(b);
              if (mIsDeleteMode) {
                   int k = (int) TypedValue.applyDimension(1, 5.0F, getContext()
                             .getResources().getDisplayMetrics());
                   localTagView.setPadding(localTagView.getPaddingLeft(),
                             localTagView.getPaddingTop(), k,
                             localTagView.getPaddingBottom());
                   localTagView.setCompoundDrawablesWithIntrinsicBounds(0, 0,
                             R.drawable.forum_tag_close, 0);
              }
              if (t.getBackgroundResId() > 0) {
                   localTagView.setBackgroundResource(t.getBackgroundResId());
              }
              if ((t.getLeftDrawableResId() > 0) || (t.getRightDrawableResId() > 0)) {
                   localTagView.setCompoundDrawablesWithIntrinsicBounds(
                             t.getLeftDrawableResId(), 0, t.getRightDrawableResId(), 0);
              }
              localTagView.setOnClickListener(this);
              localTagView
                        .setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                             public void onCheckedChanged(
                                       CompoundButton paramAnonymousCompoundButton,
                                       boolean paramAnonymousBoolean) {
                                  t.setChecked(paramAnonymousBoolean);
                                  if (TagListView.this.mOnTagCheckedChangedListener != null) {
                                       TagListView.this.mOnTagCheckedChangedListener
                                                 .onTagCheckedChanged(
                                                           (TagView) paramAnonymousCompoundButton,
                                                           t);
                                  }
                             }
                        });
              addView(localTagView);
         }
    
         public void addTag(int i, String s) {
              addTag(i, s, false);
         }
    
         public void addTag(int i, String s, boolean b) {
              addTag(new Tag(i, s), b);
         }
    
         public void addTag(Tag tag) {
              addTag(tag, false);
         }
    
         public void addTag(Tag tag, boolean b) {
              mTags.add(tag);
              inflateTagView(tag, b);
         }
    
         public void addTags(List<Tag> lists) {
              addTags(lists, false);
         }
    
         public void addTags(List<Tag> lists, boolean b) {
              for (int i = 0; i < lists.size(); i++) {
                   addTag((Tag) lists.get(i), b);
              }
         }
    
         public List<Tag> getTags() {
              return mTags;
         }
    
         public View getViewByTag(Tag tag) {
              return findViewWithTag(tag);
         }
    
         public void removeTag(Tag tag) {
              mTags.remove(tag);
              removeView(getViewByTag(tag));
         }
    
         public void setDeleteMode(boolean b) {
              mIsDeleteMode = b;
         }
    
         public void setOnTagCheckedChangedListener(
                   OnTagCheckedChangedListener onTagCheckedChangedListener) {
              mOnTagCheckedChangedListener = onTagCheckedChangedListener;
         }
    
         public void setOnTagClickListener(OnTagClickListener onTagClickListener) {
              mOnTagClickListener = onTagClickListener;
         }
    
         public void setTagViewBackgroundRes(int res) {
              mTagViewBackgroundResId = res;
         }
    
         public void setTagViewTextColorRes(int res) {
              mTagViewTextColorResId = res;
         }
    
         public void setTags(List<? extends Tag> lists) {
              setTags(lists, false);
         }
    
         public void setTags(List<? extends Tag> lists, boolean b) {
              removeAllViews();
              mTags.clear();
              for (int i = 0; i < lists.size(); i++) {
                   addTag((Tag) lists.get(i), b);
              }
         }
    
         public static abstract interface OnTagCheckedChangedListener {
              public abstract void onTagCheckedChanged(TagView tagView, Tag tag);
         }
    
         public static abstract interface OnTagClickListener {
              public abstract void onTagClick(TagView tagView, Tag tag);
         }
    
    }
    
    
      这个类最要的部分还是inflateTagView这种方法,它将TagView解析出来出来,然后显示出TagListView所要显示的标签。
      最后Activity的代码例如以下:
    import java.util.ArrayList;
    import java.util.List;
    import com.niceapp.lib.tagview.widget.Tag;
    import com.niceapp.lib.tagview.widget.TagListView;
    import android.app.Activity;
    import android.os.Bundle;
    
    public class MainActivity extends Activity {
    
         private TagListView mTagListView;
         private final List<Tag> mTags = new ArrayList<Tag>();
         private final String[] titles = { "安全必备", "音乐", "父母学", "上班族必备", 
                   "360手机卫士", "QQ","输入法", "微信", "最美应用", "AndevUI", "蘑菇街" };
    
         @Override
         protected void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.select_tag_activity);
    
              mTagListView = (TagListView) findViewById(R.id.tagview);
              setUpData();
              mTagListView.setTags(mTags);
         }
    
         private void setUpData() {
              for (int i = 0; i < 10; i++) {
                   Tag tag = new Tag();
                   tag.setId(i);
                   tag.setChecked(true);
                   tag.setTitle(titles[i]);
                   mTags.add(tag);
              }
         }
    }
    真机显示效果例如以下:
      
      当然,这个TagView的外观还是能够自己设置的,包含字体、背景等等。






  • 相关阅读:
    add to svn ignore disabled
    Zend 安装 OpenExplorer插件
    Win7系统怎么清理注册表残留?【系统天地】
    永久免费Win10企业版激活密钥大全【系统天地】
    Win7取消自动锁屏的方法步骤【系统天地】
    手把手教你怎么激活windows10专业版【系统天地】
    win8解除网速限制的操作方法【系统天地】
    教你win10系统显卡驱动安装失败的解决方法【系统天地】
    Win7移动硬盘在电脑上不显示怎么办【系统天地】
    Win10运行程序提示不受信任的解决方法【系统天地】
  • 原文地址:https://www.cnblogs.com/yxwkf/p/3979902.html
Copyright © 2011-2022 走看看