android自定义view

旧城等待, 2022-08-08 13:59 477阅读 0赞

最近弄的项目中在看到![Image 1][]这种Center加减数量,如是就自己自定义了这样的view。

考虑到图标可能会被替换如是加了个attrs.xml文件,也就是自定义属性。

大致代码

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










现在来讲这个自定义的view,

package com.demo.myviewdemo;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.drawable.Drawable;
import android.os.Handler;
import android.os.Message;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;

/**
*
* @author fuxingkai
*
*/
public class ARLinearLayout extends LinearLayout{
private final static int REDUCTENUMBER=1;
private final static int ADDNUMBER=2;
private ImageButton reducte;
private TextView numbeText;
private ImageButton add;
private int size;
private NumberChangeClickListener numberChangeClickListener;

public ARLinearLayout(Context context, AttributeSet attrs) {
super(context, attrs);
LayoutInflater.from(context).inflate(R.layout.add_reducte, this);
initView();
// TypedArray是存放资源的array,1.通过上下文得到这个数组,attrs是构造函数传进来的,对应attrs.xml
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.ARLinearLayout);
// 获得xml里定义的属性,格式为 名称_属性名 后面是默认值
Drawable reducteDrawable = a.getDrawable(R.styleable.ARLinearLayout_reductionDrawble);
if(reducteDrawable != null) {
reducte.setImageDrawable(reducteDrawable);
};
Drawable addDrawable = a.getDrawable(R.styleable.ARLinearLayout_addDrawble);
if(addDrawable != null) {
add.setImageDrawable(addDrawable);
};
// 为了保持以后使用该属性一致性,返回一个绑定资源结束的信号给资源
a.recycle();

}

class SwitchHandler extends Handler{
public void handleMessage(Message msg) {
switch (msg.what) {
case REDUCTENUMBER:
numbeText.setText(size+””);
break;
case ADDNUMBER:
numbeText.setText(size+””);
break;

default:
break;
}
super.handleMessage(msg);
}
}

private void initView() {

reducte = (ImageButton) findViewById(R.id.good_card_number_reducte);
numbeText = (TextView) findViewById(R.id.good_card_number_text);
add = (ImageButton) findViewById(R.id.good_card_number_add);
numbeText.setText(“0”);
reducte.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if(size==0){
Toast.makeText(getContext(), “大哥不能再少了”, Toast.LENGTH_SHORT).show();
return;
}
size—;
numberChangeClickListener.onChangeNumber();
Message msg = new SwitchHandler().obtainMessage();
msg.what=REDUCTENUMBER;
msg.sendToTarget();
}
});
add.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
size++;
numberChangeClickListener.onChangeNumber();
Message msg = new SwitchHandler().obtainMessage();
msg.what=ADDNUMBER;
msg.sendToTarget();
}
});
}

public int getNumber(){
return size;
}

public void setNumberChangeClickListener(NumberChangeClickListener numberChangeClickListener){
this.numberChangeClickListener = numberChangeClickListener;
}

/**
* 声明一个接口,点击加,减的时候调用
* @author fuxingkai
*
*/
public interface NumberChangeClickListener {
void onChangeNumber();
}

}

里面代码很简单,继承了一个LinearLayout,然后通过组合控件来自定义view,在构造函数里面判断是否要自定义加减图标,声明一个接口给点击加减的时候调用,这里用了handler来更新数量,可以通过getNumber()方法来获得当前的数量,

布局文件代码add_reducte.xml

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













MainActivity很简单代码如下

package com.demo.myviewdemo;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.widget.Toast;

import com.demo.myviewdemo.ARLinearLayout.NumberChangeClickListener;

/**
*
* @author fuxingkai
*
*/
public class MainActivity extends Activity {

private ARLinearLayout arLinearLayout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}

private void initView() {
arLinearLayout = (ARLinearLayout) this.findViewById(R.id.number_linear);
arLinearLayout.setNumberChangeClickListener(new NumberChangeClickListener() {
@Override
public void onChangeNumber() {
int number = arLinearLayout.getNumber();
Toast.makeText(MainActivity.this, number+””, Toast.LENGTH_SHORT).show();
}
});
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}

}

就是拿到自定义view,然后设置数量改变的监听然后弹出当前数量,

最后就是activity_main.xml

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







需要注意的是![Image 1][]以下这两个地方Center 1

下面看看效果

Center 2Center 3

第一次写博客,写不好请见谅,嘿嘿

源码下载链接:http://download.csdn.net/detail/kai\_1215/8727013

[Image 1]:

发表评论

表情:
评论列表 (有 0 条评论,477人围观)

还没有评论,来说两句吧...

相关阅读

    相关 android定义view

    最近弄的项目中在看到![Image 1][]这种![Center][]加减数量,如是就自己自定义了这样的view。 考虑到图标可能会被替换如是加了个attrs.xml文件,也

    相关 Android定义View

    1.View是什么? View是屏幕上的一块矩形区域,它负责用来显示一个区域,并且响应这个区域内的事件。可以说,手机屏幕上的任意一部分看的见得地方都是View,它很常见,比

    相关 Android定义View

    前几天在郭霖大神的博客上看了自定义View的知识,感觉受益良多,大神毕竟大神。在此总结一下关于Android 自定义View的用法: 首先,自定义View可以由基本控件或者组

    相关 Android定义View

    如何自定义控件 1. 自定义属性的声明和获取 2. 测量onMeasure:测量自定义控件的尺寸 3. 绘制onDraw:绘制自定义控件 4. 状态的存储与恢复: