先上效果图,类似这种的
一、首先我们自定义一个继承自LinearLayout的类,如下KeyBoardLinearLayout
package bai.bai.bai.demo;
import android.content.Context;
import android.content.res.TypedArray;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.LinearLayout;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class KeyBoardLinearLayout extends LinearLayout implements AdapterView.OnItemClickListener, View.OnClickListener {
String[] datas = {"1", "2", "3", "4", "5", "6", "7", "8", "9", ".", "0", "del"};//数字键盘上的显示内容
private int mItemHeight; //行高
private float mItemTextSize; //item文字大小
private String mInputNum; //输入数字
private KeyBoardNumAdapter mAdapter;
private KeyBoartTouchListener mKeyBoartTouchListener;
public KeyBoardLinearLayout(Context context) {
this(context, null);
}
public KeyBoardLinearLayout(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
//-------1-------下面的layout为整体布局的layout
View view = LayoutInflater.from(context).inflate(R.layout.keyboard_linearlayout, null);
setLinearLayoutStyle(context, attrs, view);
addView(view);
}
private void setLinearLayoutStyle(Context context, AttributeSet attrs, View view) {
//------2-------这个styleable为自己写在value文件夹的attrs里的自定义style,用于自定义属性
TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.KeyBoardLinearLayoutStyle);
mItemHeight = array.getDimensionPixelSize(R.styleable.KeyBoardLinearLayoutStyle_itemHeight, 100);
mItemTextSize = array.getDimension(R.styleable.KeyBoardLinearLayoutStyle_itemTextSize, 30);
GridView gvKeyBoardNum = (GridView) view.findViewById(R.id.gr_keyboard_num); //左侧键盘
gvKeyBoardNum.setOnItemClickListener(this);
mAdapter = new KeyBoardNumAdapter(context, Arrays.asList(datas));
gvKeyBoardNum.setAdapter(mAdapter);
TextView tvKeyBoardEmpty = (TextView) view.findViewById(R.id.tv_keyboard_empty); //右侧清空按钮
tvKeyBoardEmpty.setOnClickListener(this);
tvKeyBoardEmpty.setTextSize(mItemTextSize);
TextView tvKeyBoardOk = (TextView) view.findViewById(R.id.tv_keyboard_ok); //右侧确定按钮
tvKeyBoardOk.setOnClickListener(this);
tvKeyBoardOk.setTextSize(mItemTextSize);
}
//为清空、确定按钮添加监听
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.tv_keyboard_empty:
mKeyBoartTouchListener.onEmptyTouch();
break;
case R.id.tv_keyboard_ok:
mKeyBoartTouchListener.onOkTouch();
break;
}
}
//为数字键盘添加监听
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
mKeyBoartTouchListener.onNumberTouch(mAdapter.getItem(position) + "");
}
//在引用的时候必须要实现此接口,就像要实现button的监听必须要实现OnClickListener接口一样
public interface KeyBoartTouchListener {
void onNumberTouch(String inputNumber);
void onEmptyTouch();
void onOkTouch();
}
//同button的setOnClickListener一样
public void setKeyBoartTouchListener(KeyBoartTouchListener listener) {
this.mKeyBoartTouchListener = listener;
}
//数字键盘的adapter
private class KeyBoardNumAdapter extends BaseAdapter {
private Context mContext;
private List<String> mNumbers;
private LayoutInflater inflater;
public KeyBoardNumAdapter(Context mContext, List<String> mNumbers) {
this.mContext = mContext;
this.mNumbers = getNumbers(mNumbers);
this.inflater = LayoutInflater.from(mContext);
}
private List<String> getNumbers(List<String> mNumbers) {
if (mNumbers == null) {
mNumbers = new ArrayList<>();
}
return mNumbers;
}
@Override
public int getCount() {
return mNumbers.size();
}
@Override
public Object getItem(int position) {
return mNumbers.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHodler hodler;
if (convertView == null) {
hodler = new ViewHodler();
//------3------这个layout是数字键盘的layout
convertView = inflater.inflate(R.layout.item_key_button, null);
hodler.mTvStyle = (TextView) convertView.findViewById(R.id.tv_style);
hodler.mTvStyle.setTextSize(mItemTextSize);
hodler.mLlStyle = (LinearLayout) convertView.findViewById(R.id.ll_style);
convertView.setTag(hodler);
} else {
hodler = (ViewHodler) convertView.getTag();
}
setViewHeight(hodler.mTvStyle);
setViewHeight(hodler.mLlStyle);
String number = mNumbers.get(position);
hodler.mTvStyle.setText(number);
//这个是为了把返回键变为图片的返回键
if (position == 11) {
hodler.mTvStyle.setVisibility(GONE);
hodler.mLlStyle.setVisibility(VISIBLE);
}
return convertView;
}
/**
* 设置子控件的高度
*/
private void setViewHeight(View view) {
LayoutParams params = (LayoutParams) view.getLayoutParams();
params.height = mItemHeight;
view.setLayoutParams(params);
}
private class ViewHodler {
private TextView mTvStyle;
private LinearLayout mLlStyle;
}
}
}
二、现在是上面红色的三个准备条件
1、整体键盘的layout布局,里面的具体dimen、drawable、color可根据自己的来设置
<?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="wrap_content"
android:orientation="vertical">
<!--输入键盘-->
<LinearLayout
android:id="@+id/ll_key_board"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/main_key_board_line_color">
<GridView
android:id="@+id/gr_keyboard_num"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_weight="3"
android:background="@color/main_key_board_line_color"
android:horizontalSpacing="@dimen/main_key_board_line"
android:numColumns="3"
android:verticalSpacing="@dimen/main_key_board_line" />
<!-- android:verticalSpacing="1dp" -->
<LinearLayout
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:orientation="vertical">
<TextView
android:id="@+id/tv_keyboard_empty"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:background="@drawable/select_key_board_tv_empty"
android:gravity="center"
android:text="清空"
android:textColor="#eee"
android:textSize="@dimen/button_text_size" />
<View
android:layout_width="match_parent"
android:layout_height="@dimen/main_key_board_line"
android:background="@color/main_key_board_line_color" />
<TextView
android:id="@+id/tv_keyboard_ok"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="3"
android:background="@drawable/select_key_board_tv_ok"
android:gravity="center"
android:text="确定"
android:textColor="#eee"
android:textSize="@dimen/button_text_size" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
1.1、此时可补充一下按键的选择器,比如ok键的选择器
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!--<item android:drawable="@color/input_cash_press" android:state_pressed="true" />-->
<!--<item android:drawable="@color/input_cash_press" android:state_selected="true" />-->
<!--<item android:drawable="@color/input_cash_normal" android:state_enabled="true" />-->
<item android:state_pressed="true">
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
<!-- 按下 -->
<solid android:color="#655f" />
<!--<stroke android:width="1dp" android:color="@color/main_calculate_text_color" />-->
</shape>
</item>
<item android:state_pressed="false">
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
<!-- 抬起 -->
<solid android:color="#e39f" />
<!--<stroke android:width="1dp" android:color="@color/main_calculate_text_color" />-->
</shape>
</item>
</selector>
2、在res --> values文件夹下的attrs文件(如果没有就自己新建一个)里添加,自定义属性
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="KeyBoardLinearLayoutStyle">
<attr name="itemHeight" format="dimension"/>//item的行高
<attr name="itemTextSize" format="dimension"/>//文字大小
</declare-styleable>
</resources>
3、数字键盘的item
<?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="100dp"
android:orientation="vertical">
<TextView
android:id="@+id/tv_style"
android:layout_width="match_parent"
android:layout_height="100dp"
android:layout_gravity="center"
android:background="@drawable/select_key_board_tv_num"
android:gravity="center"
android:text="del"
android:textSize="@dimen/button_text_size" />
<LinearLayout
android:id="@+id/ll_style"
android:layout_width="match_parent"
android:layout_height="100dp"
android:layout_gravity="center"
android:background="@drawable/select_key_board_tv_num"
android:gravity="center"
android:visibility="gone">
<ImageView
android:layout_width="@dimen/button_image_size"
android:layout_height="@dimen/button_image_size"
android:src="@drawable/ic_launcher_background" />
</LinearLayout>
</LinearLayout>
三、引用自定义控件
package bai.bai.bai.demo;
import android.app.Activity;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Toast;
public class MainActivity extends Activity implements KeyBoardLinearLayout.KeyBoartTouchListener{ //要实现接口
KeyBoardLinearLayout keyBoardLinearLayout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
keyBoardLinearLayout = (KeyBoardLinearLayout)findViewById(R.id.kbll_keyboard);
keyBoardLinearLayout.setKeyBoartTouchListener(this);
}
@Override
public void onNumberTouch(String inputNumber) {
Toast.makeText(MainActivity.this, "我点击了数字:" + inputNumber, Toast.LENGTH_SHORT).show();
}
@Override
public void onEmptyTouch() {
Toast.makeText(MainActivity.this, "我点击了清空按钮", Toast.LENGTH_SHORT).show();
}
@Override
public void onOkTouch() {
Toast.makeText(MainActivity.this, "我点击了确定按钮", Toast.LENGTH_SHORT).show();
}
}
在布局里直接引用自定义view
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<bai.bai.bai.demo.KeyBoardLinearLayout
android:id="@+id/kbll_keyboard"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
app:itemHeight="50dp"//这个是每一行的高度
app:itemTextSize="10sp" />//这个是文字大小
</RelativeLayout>
ok,完成