Android tag control and android tag Control
Version: 1.0 Date: Copyright:©2014 some tags may need to be set in some applications to facilitate the query of certain information, such as mobile assistant or shopping software. In the early stage of software development, using TextView and Button is the simplest method. However, this method also has its own limitations, such as the inability to control line breaks and low coupling. In addition to solving these problems, it is best to encapsulate a class library for future use. First, create a Tag class,
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; }}This class encapsulates the background image resource, id, and check of the label view. Create a new TagView class and inherit from 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); } }}This TagView is the label view, which displays the label information. The corresponding xml file is as follows, 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" />
Display: There is an android-flowlayout control on github, which dynamically wraps the view based on the size of the subview,
Therefore, you can use this control to control the line feed without repeatedly inventing the wheel. The class implemented by the android-flowlayout function is FlowLayout. Therefore, the label control is implemented by inheriting this class.
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); }}The most important part of this class is the inflateTagView method. It parses the TagView and displays the tag to be displayed in the TagListView. The code for the last Activity is as follows:
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 = {"Security Essentials", "Music", "parents", "office workers required", "360 mobile guard", "QQ ", "input method", "", "most beautiful application", "AndevUI", "mogujie.com"}; @ 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 );}}}The Display Effect of the real machine is as follows: Of course, the appearance of the TagView can still be set by yourself, including the font and background. Code: http://download.csdn.net/detail/wangjinyu501/7673827
What is the difference between @ ID/XX and @ + id/xx when defining the Control id in the android page layout? @ Id/xx
The component in Android needs to be represented by an int value, which is the id attribute value in the component tag. The id attribute can only accept the value of the resource type, that is, the value that must begin with @, such as @ id/abc and @ + id/xyz.
If "+" is used after @, it indicates that after a layout file is modified and saved, the system will automatically generate the corresponding int type variable in the R. java file. The variable name is the value after "/". For example, @ + id/xyz will generate int xyz = value in the R. java file, where value is a hexadecimal number. If xyz already has a variable with the same name in R. java, the new variable is not generated, and the component uses the value of this existing variable.
That is to say, if the form of @ + id/name exists in R. java, the component uses the value of this variable as the identifier. If the variable does not exist, add a new variable and assign the corresponding value to the variable (no duplicates ).
Since the id attribute of a component is a resource id, you can set any existing resource id value, for example, @ drawable/icon, @ string/OK, @ + string/you, etc. Of course, you can also set the existing resource id in the android system. For example, what does android mean by @ id/android: list proposed by the landlord? In fact, this android is the system's R class (in R. the package in the java file. You can enter android. R. id. In the Java code editing area to list the corresponding resource IDs. For example, you can also set the id attribute value to @ id/android: message.
<ListView android: id = "@ + id/android: message"
Android: layout_width = "wrap_content"
Android: layout_height = "wrap_content"/>
You can also view the ids defined in the system, go to the <android sdk installation directory> \ platforms \ android-1.5 \ data \ res \ values directory, and find ids. xml file. After opening, the content is as follows:
<? Xml version = "1.0" encoding = "UTF-8"?>
<Resources>
<Item type = "id" name = "price_edit"> false </item>
<Item type = "id" name = "amount_edit"> false </item>
</Resources>
If ids are defined in ids. xml, @ ID/price_edit can be defined as follows in layout; otherwise, @ + id/price_edit
Android Control Selection
1. <ScrollView
Android: layout_width = "fill_parent"
Android: layout_height = "wrap_content"
>
<TextView
Android: layout_width = "wrap_content"
Android: layout_height = "wrap_content"
Android: text = "@ string/hello_world"/>
</ScrollView>
Note that ScrollView can only have one subcontrol.
2. The second feature is a little complicated. You can refer to the usage of Android handler, thread, and progressDialog and give you several keywords to learn how to use them. This will help you more.