2018-08-20 15:39:19 lpCrazyBoy 阅读数 517
  • 快速入门Android开发 视频 教程 android studio

    这是一门快速入门Android开发课程,顾名思义是让大家能快速入门Android开发。 学完能让你学会如下知识点: Android的发展历程 搭建Java开发环境 搭建Android开发环境 Android Studio基础使用方法 Android Studio创建项目 项目运行到模拟器 项目运行到真实手机 Android中常用控件 排查开发中的错误 Android中请求网络 常用Android开发命令 快速入门Gradle构建系统 项目实战:看美图 常用Android Studio使用技巧 项目签名打包 如何上架市场

    21575 人正在学习 去看看 任苹蜻

之前是用RelativeLayout相对布局来实现的批量按钮的排列显示,感觉不是太方便了现在。现在可以用GridView来实现批量按钮的排列问题。

效果图如下:

(向要圆形按钮的话,查看之前的博客即可。)

public class MainActivity extends AppCompatActivity {

    private Context mContext;
    private GridView gridView;
    private int btnCount = 52;
    private int btnEachRowCount = 6;
    private ArrayList<String> stringArrayList;
    private ButtonListAdapter buttonListAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mContext = this;
        stringArrayList = new ArrayList<>();
        DeviceBaseInfo.getActivityWidthAndHeight(getWindowManager());

        gridView = findViewById(R.id.Main_gViewBtnList);

        for (int i=0;i<btnCount;i++) {
            stringArrayList.add(i + "");
        }

        buttonListAdapter = new ButtonListAdapter(mContext, stringArrayList);
        gridView.setAdapter(buttonListAdapter);
    }
}

我这边是随手写了一个适配器,其实不用写。直接用BaseAdapter即可。

主要是一个思路,其他代码就不写了。

2015-10-20 18:08:00 luengyong 阅读数 2487
  • 快速入门Android开发 视频 教程 android studio

    这是一门快速入门Android开发课程,顾名思义是让大家能快速入门Android开发。 学完能让你学会如下知识点: Android的发展历程 搭建Java开发环境 搭建Android开发环境 Android Studio基础使用方法 Android Studio创建项目 项目运行到模拟器 项目运行到真实手机 Android中常用控件 排查开发中的错误 Android中请求网络 常用Android开发命令 快速入门Gradle构建系统 项目实战:看美图 常用Android Studio使用技巧 项目签名打包 如何上架市场

    21575 人正在学习 去看看 任苹蜻

手里有个项目,看设计原型,像是使用单选按钮来实现选择条件,但是又是排列整齐的按钮。记得单选RadioGroup只有纵横排列,并不支持九宫格的排列,但是要实现九宫格的排列样式,也未尝不可,可以在<RaidoGroup>标签中使用其他的布局来辅助实现,只可惜这样做会留下一个很不爽的结果,同一行的RadioButton都变成了CheckedBox,可多选,很明显,这个并不是我们想要的结果。要解决这种窘境,也是有办法的,那就是用一个标志位,只允许选择一个按钮;只是博文里,我并不想用这种办法,一方面,控制麻烦,如果页面里有多个这样的布局,那个代码量可是相当的不爽,另一方面,我是新人,所以想尝试自定义控件来实现,以便累积点技能经验。(代码拙劣,大侠们请包涵,)

实现主要分为三部分,第一部分:自定义按钮;第二部分:自定义按钮容器;第三部分:按钮的背景。

首先,第一部分,代码:

import android.content.Context;
import android.graphics.Canvas;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Button;

import cn.leungyong.app.R;

/**
 * 
 * Description:
 * Created by L.Y
 * Date:2015-10-20
 * Time:14:48
 * Copyright :c
 */
public class MyRadio extends Button implements View.OnTouchListener{

    private boolean isTouched = false;//是否被按下

    private int touch = 1;//按钮被按下的次数

    public MyRadio(Context context){
        super(context);
        init();
    }

    public MyRadio(Context context, AttributeSet attributeSet){
        super(context,attributeSet);
        init();
    }

    public MyRadio(Context context, AttributeSet attributeSet, int defStyle){
        super(context, attributeSet, defStyle);
        init();
    }

    protected void init(){
        setOnTouchListener(this);
    }

    public void setTouch(int touch){
        this.touch = touch;
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        if(0 == touch%2){
            this.setBackgroundResource(R.drawable.myradio_active);
        }else {
            this.setBackgroundResource(R.drawable.myradio_inactive);
        }
        invalidate();
    }

    public void setTouched(boolean isTouched){
        this.isTouched = isTouched;
    }

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        switch (event.getAction()){
            case MotionEvent.ACTION_DOWN:
                onValueChangedListner.OnValueChanged(this.getText().toString());
                isTouched = true;
                touch ++;
                break;
            case MotionEvent.ACTION_UP:
                isTouched = false;
                break;
        }
        return true;
    }

    public interface OnValueChangedListner{
        void OnValueChanged(String value);
    }

    //实现接口,方便将当前按钮的值回调
    OnValueChangedListner onValueChangedListner;

    public void setOnValueChangedListner(OnValueChangedListner onValueChangedListner){
        this.onValueChangedListner = onValueChangedListner;
    }
}
在按钮源码中,使用touch变量来记录当前按钮被按下的次数,同时实现Touch监听,以此来改变touch变量来改变按钮状态,重载OnDraw,在函数中修改按钮背景,接口OnValueChangedListener用于数据回调。

第二部分,容器:

import android.content.Context;
import android.graphics.Color;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.LinearLayout;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Description:
 * Created by L.Y
 * Date:2015-10-20
 * Time:11:26
 * Copyright :
 */
public class ChoiceGroup extends LinearLayout {

    private int column = 0;//列数

    private int currentIndex = 0;//当前按钮下标

    private String currentValue = "";//当前按钮值

    private List<String> values = new ArrayList<>();//按钮文字列表

    private Map<Integer, Button> map = new HashMap<>();//按钮map

    public ChoiceGroup(Context context){
        super(context);
        init(context);
    }

    public ChoiceGroup(Context context,AttributeSet attributeSet){
        super(context,attributeSet);
        init(context);
    }

    public ChoiceGroup(Context context, AttributeSet attributeSet, int defStyle){
        super(context, attributeSet, defStyle);
        init(context);
    }

    //初始化容器
    public void init(Context context){
        setGravity(Gravity.CENTER);
        setOrientation(VERTICAL);
        setBackgroundColor(Color.WHITE);
    }

    //设置当前被选下按钮
    public void setInitChecked(int index){
        ((MyRadio)map.get(index)).setTouch(2);
        setCurrentValue(((MyRadio)map.get(index)).getText().toString());
    }

    public void setColumn(int column){
        this.column = column;
    }

    public void setCurrentValue(String value){
        this.currentValue = value;
    }

    public String getCurrentValue(){
        return this.currentValue;
    }

    public void setValues(List<String> values){
        this.values = values;
    }
    //初始化容器所有视图
    public void setView(final Context context){
        int size = values.size();
        int row = size/column;
        int leftSize = size%column;
        for(int i=0;i<row;i++){
            LinearLayout linearLayout = new LinearLayout(context);
            linearLayout.setOrientation(HORIZONTAL);
            linearLayout.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, 0, 1));
            for(int j=0;j<column;j++){
                final MyRadio button = new MyRadio(context);
                button.setGravity(Gravity.CENTER);
                LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(0, ViewGroup.LayoutParams.WRAP_CONTENT,1);
                layoutParams.setMargins(8, 8, 8, 8);
                button.setLayoutParams(layoutParams);
                button.setText(values.get(column * i + j));
                currentIndex = column * i + j;
                button.setOnValueChangedListner(new MyRadio.OnValueChangedListner() {
                    @Override
                    public void OnValueChanged(String value) {
                        setCurrentValue(value);
                        clearSelected(currentIndex);
                    }
                });
                map.put(column * i + j,button);
                linearLayout.addView(button);
            }
            addView(linearLayout);
        }
        if(leftSize != 0){
            LinearLayout linearLayout = new LinearLayout(context);
            linearLayout.setOrientation(HORIZONTAL);
            linearLayout.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, 0, 1));
            for(int m=0;m<column;m++){
                if(m<leftSize) {
                    final MyRadio button = new MyRadio(context);
                    LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(0, ViewGroup.LayoutParams.WRAP_CONTENT, 1);
                    layoutParams.setMargins(8, 8, 8, 8);
                    button.setGravity(Gravity.CENTER);
                    button.setLayoutParams(layoutParams);
                    button.setText(values.get(size - leftSize + m));
                    currentIndex = size - leftSize + m;
                    button.setOnValueChangedListner(new MyRadio.OnValueChangedListner() {
                        @Override
                        public void OnValueChanged(String value) {
                            setCurrentValue(value);
                            clearSelected(currentIndex);
                        }
                    });
                    map.put(size - leftSize + m,button);
                    linearLayout.addView(button);
                }else {
                    LinearLayout.LayoutParams layoutParamsV = new LinearLayout.LayoutParams(0, ViewGroup.LayoutParams.WRAP_CONTENT, 1);
                    layoutParamsV.setMargins(8, 8, 8, 8);
                    Button view = new Button(context);
                    view.setLayoutParams(layoutParamsV);
                    view.setGravity(Gravity.CENTER);
                    view.setText("123");
                    view.setVisibility(INVISIBLE);
                    view.setBackgroundColor(Color.RED);
                    linearLayout.addView(view);
                }
            }
            addView(linearLayout);
        }
    }

    //清除所有选择
    private void clearSelected(int Index){
        System.out.println("length = "+map.size());
        for(int index = 0;index < map.size(); index ++){

            ((MyRadio)map.get(index)).setTouch(1);
        }
    }

}


容器继承自LinearLayout,里面自定义的LinearLayout,将控件按权重排列,按钮实现OnValueChangedListener,将其值回调。

第三部分:背景(贴上去,充充字数吧,另一个实现也是一样的,不贴了)

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <corners android:radius="3dp"></corners>
    <solid android:color="@color/lightblue"></solid>
    <stroke android:color="@color/lightblue" android:width="1dp"></stroke>
</shape>

最后,定义好了空间,自然就是怎样去引用了,在Activity的布局xml中:

<cn.leungyong.app.ui.view.ChoiceGroup
      android:id="@+id/choiceGroup"
      android:background="@color/white"
      android:layout_width="match_parent"
      android:layout_height="wrap_content">
</cn.leungyong.app.ui.view.ChoiceGroup>

在java源码中实现:

List<String> list = new ArrayList<String>();
list.add("施工");
list.add("服务");
list.add("设计");
list.add("监理");
list.add("其他");


ChoiceGroup choiceGroup = (ChoiceGroup)findViewById(R.id.choiceGroup)
choiceGroup.setColumn(3);//设置列数
choiceGroup.setValues(list);//设置记录列表
choiceGroup.setView(this);//设置视图
choiceGroup.setInitChecked(0);//设置最初默认被选按钮


choiceGroup.getCurrentValue();//获取当前被选择的按钮值

最后结果:





2015-09-19 13:36:56 ljw124213 阅读数 762
  • 快速入门Android开发 视频 教程 android studio

    这是一门快速入门Android开发课程,顾名思义是让大家能快速入门Android开发。 学完能让你学会如下知识点: Android的发展历程 搭建Java开发环境 搭建Android开发环境 Android Studio基础使用方法 Android Studio创建项目 项目运行到模拟器 项目运行到真实手机 Android中常用控件 排查开发中的错误 Android中请求网络 常用Android开发命令 快速入门Gradle构建系统 项目实战:看美图 常用Android Studio使用技巧 项目签名打包 如何上架市场

    21575 人正在学习 去看看 任苹蜻

1,RadioGroup是RadioButton的一个集合,能够实现多选一。

2,RadioGroup常用属性:

android:orientation="vertical"、android:orientation="horizontal"

 //作用:决定当前RadioGroup中RadioButton以什么形式排列。

3,RadioButton常用属性:

android:checked="false"  //当前CheckBox是否被选中,默认为false。

4,RadioButton和RadioGroup的关系:
   a、RadioButton表示单个圆形单选框,而RadioGroup是可以容纳多个RadioButton的容器
   b、每个RadioGroup中的RadioButton同时只能有一个被选中
   c、不同的RadioGroup中的RadioButton互不相干,即如果组A中有一个选中了,组B中依然可以有一个被选中
   d、大部分场合下,一个RadioGroup中至少有2个RadioButton
   e、大部分场合下,一个RadioGroup中的RadioButton默认会有一个被选中,并建议您将它放在RadioGroup中的起始位置

5,layout中的布局文件:

 

<span style="font-size:18px;"><RadioGroup 
       android:id="@+id/radioGrup1"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:orientation="vertical">
       
    <RadioButton
        android:id="@+id/radioButton1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="男" 
        android:checked="true"/>

    <RadioButton
        android:id="@+id/radioButton2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="女"
        android:checked="false" />

    </RadioGroup> </span>


6,java类中的代码:

<span style="font-size:18px;">public class MainActivity extends Activity implements OnCheckedChangeListener {

	private RadioGroup rg;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		rg = (RadioGroup) findViewById(R.id.radioGrup1);

		// 通过实现接口的方式来实现监听事件
		rg.setOnCheckedChangeListener(this);
	}

	@Override
	public void onCheckedChanged(RadioGroup group, int checkedId) {

		// 判断对哪个按钮实现了监听
		switch (checkedId) {
		case R.id.radioButton1:
			Log.i("tag", "你当前是一个男孩");
			break;

		case R.id.radioButton2:
			Log.i("tag", "你当前是一个女孩");
			break;
		default:
		}
	}

}</span>


注意:在实现接口时,要把导入的包:import android.widget.CompoundButton.OnCheckedChangeListener

改为:import android.widget.RadioGroup.OnCheckedChangeListener。



2015-02-10 23:07:18 u011282069 阅读数 2082
  • 快速入门Android开发 视频 教程 android studio

    这是一门快速入门Android开发课程,顾名思义是让大家能快速入门Android开发。 学完能让你学会如下知识点: Android的发展历程 搭建Java开发环境 搭建Android开发环境 Android Studio基础使用方法 Android Studio创建项目 项目运行到模拟器 项目运行到真实手机 Android中常用控件 排查开发中的错误 Android中请求网络 常用Android开发命令 快速入门Gradle构建系统 项目实战:看美图 常用Android Studio使用技巧 项目签名打包 如何上架市场

    21575 人正在学习 去看看 任苹蜻

效果图:
这里写图片描述
现在市场上大多数软件都是类似于上面的结构,底部有几个按钮用于切换到不同的界面。基于OOP思想,我想把下面的一整块布局封装成一个类,也就是我们的自定义组合控件—底部多按钮切换布局,我把它叫做BottomLayout

看上面的布局,几个按钮横向排列,我们先看一下布局
这里写图片描述
最外面LinearLayout 方向 horizontal,然后5个weight相同的RelativeLayout,每个RelativeLayout里面有一个Button(用了显示选中状态)个ImageView(用来显示红点)

<?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="50dp"
    android:orientation="horizontal" >

    <RelativeLayout
        android:id="@+id/rl_home"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:clickable="true" >

        <ImageView
            android:id="@+id/iv_new_home"
            android:layout_width="10dp"
            android:layout_height="10dp"
            android:layout_alignParentRight="true"
            android:layout_margin="3dp"
            android:src="@drawable/read_circle" />

        <Button
            android:id="@+id/btn_home"
            android:layout_width="50dp"
            android:layout_height="50dp"
            android:layout_centerInParent="true"
            android:background="@drawable/tab_home_selector"
            android:clickable="false" />
    </RelativeLayout>

    <RelativeLayout
        android:id="@+id/rl_encounter"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:clickable="true" >

        <Button
            android:id="@+id/btn_encounter"
            android:layout_width="50dp"
            android:layout_height="50dp"
            android:layout_centerInParent="true"
            android:background="@drawable/tab_enconter_selector"
            android:clickable="false" />
    </RelativeLayout>

    <RelativeLayout
        android:id="@+id/rl_community"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:clickable="true" >

        <ImageView
            android:id="@+id/iv_new_community"
            android:layout_width="10dp"
            android:layout_height="10dp"
            android:layout_alignParentRight="true"
            android:layout_margin="3dp"
            android:src="@drawable/read_circle" />

        <Button
            android:id="@+id/btn_community"
            android:layout_width="50dp"
            android:layout_height="50dp"
            android:layout_centerInParent="true"
            android:background="@drawable/tab_community_selector"
            android:clickable="false" />
    </RelativeLayout>

    <RelativeLayout
        android:id="@+id/rl_message"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:clickable="true" >

        <ImageView
            android:id="@+id/iv_new_message"
            android:layout_width="10dp"
            android:layout_height="10dp"
            android:layout_alignParentRight="true"
            android:layout_margin="3dp"
            android:src="@drawable/read_circle" />

        <Button
            android:id="@+id/btn_message"
            android:layout_width="50dp"
            android:layout_height="50dp"
            android:layout_centerInParent="true"
            android:background="@drawable/tab_message_selector"
            android:clickable="false" />
    </RelativeLayout>

    <RelativeLayout
        android:id="@+id/rl_user"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:clickable="true" >

        <Button
            android:id="@+id/btn_user"
            android:layout_width="50dp"
            android:layout_height="50dp"
            android:layout_centerInParent="true"
            android:background="@drawable/tab_user_selector"
            android:clickable="false" />
    </RelativeLayout>

</LinearLayout>

下面就是代码了

package comzyh.bottomlayout;

import android.content.Context;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.LinearLayout;

/**
 * 主界面底部的按钮切换布局
 * 
 * @version 1.0
 * @author zyh
 */
public class BottomLayout extends LinearLayout implements OnClickListener {

    public BottomLayout(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init(context);
    }

    public BottomLayout(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public BottomLayout(Context context) {
        this(context, null, 0);
    }

    private Context context;
    private View rl_home, rl_encounter, rl_community, rl_message, rl_user;
    private View iv_new_message, iv_new_home;
    private Button btn_home, btn_encounter, btn_community, btn_message, btn_user;
    private OnItemClickListener listener;
    private int currentPosition = 0;

    /**
     * 初始化
     * 
     * @version 1.0
     * @author zyh
     * @param context
     */
    private void init(Context context) {
        this.context = context;
        LayoutInflater.from(context).inflate(R.layout.layout_bottom, this);
        // 5块等分的布局
        rl_home = findViewById(R.id.rl_home);
        rl_encounter = findViewById(R.id.rl_encounter);
        rl_community = findViewById(R.id.rl_community);
        rl_message = findViewById(R.id.rl_message);
        rl_user = findViewById(R.id.rl_user);

        // 5个按钮
        btn_home = (Button) findViewById(R.id.btn_home);
        btn_encounter = (Button) findViewById(R.id.btn_encounter);
        btn_community = (Button) findViewById(R.id.btn_community);
        btn_message = (Button) findViewById(R.id.btn_message);
        btn_user = (Button) findViewById(R.id.btn_user);

        // 小圆点
        iv_new_home = findViewById(R.id.iv_new_home);
        iv_new_message = findViewById(R.id.iv_new_message);

        hideHomeCircle();
        hideMessageCircle();
        changeButtonStatus(0);// 默认是位置0
        setListener();
    }

    /**
     * 显示首页按钮旁边的小红圈
     * 
     * @version 1.0
     * @author zyh
     */
    public void showHomeCircle() {
        iv_new_home.setVisibility(View.VISIBLE);
    }

    /**
     * 隐藏首页按钮旁边的小红圈
     * 
     * @version 1.0
     * @author zyh
     */
    public void hideHomeCircle() {
        iv_new_home.setVisibility(View.GONE);
    }

    /**
     * 显示首页按钮旁边的小红圈
     * 
     * @version 1.0
     * @author zyh
     */
    public void showMessageCircle() {
        iv_new_message.setVisibility(View.VISIBLE);
    }

    /**
     * 隐藏首页按钮旁边的小红圈
     * 
     * @version 1.0
     * @author zyh
     */
    public void hideMessageCircle() {
        iv_new_message.setVisibility(View.GONE);
    }

    /**
     * 为按钮设计按下监听
     * 
     * @version 1.0
     * @author zyh
     */
    private void setListener() {
        rl_home.setOnClickListener(this);
        rl_encounter.setOnClickListener(this);
        rl_community.setOnClickListener(this);
        rl_message.setOnClickListener(this);
        rl_user.setOnClickListener(this);
    }

    /**
     * 提供给外部设置点击Item的接口
     * 
     * @version 1.0
     * @author zyh
     * @param listener
     */
    public void setOnItemClickListener(OnItemClickListener listener) {
        this.listener = listener;
    }

    public interface OnItemClickListener {
        public void onItemClick(int position);
    }

    @Override
    public void onClick(View v) {
        currentPosition = 0;
        switch (v.getId()) {
            case R.id.rl_home:
                currentPosition = 0;
                break;
            case R.id.rl_encounter:
                currentPosition = 1;
                break;
            case R.id.rl_community:
                currentPosition = 2;
                break;
            case R.id.rl_message:
                currentPosition = 3;
                break;
            case R.id.rl_user:
                currentPosition = 4;
                break;
        }
        if (listener == null) {
            return;
        }
        listener.onItemClick(currentPosition);
        changeButtonStatus(currentPosition);
    }

    /**
     * 根据当前位置改变按钮选中状态
     * 
     * @version 1.0
     * @author zyh
     * @param position
     */
    private void changeButtonStatus(int position) {
        btn_home.setSelected(position == 0);
        btn_encounter.setSelected(position == 1);
        btn_community.setSelected(position == 2);
        btn_message.setSelected(position == 3);
        btn_user.setSelected(position == 4);
    }
}
  • 设置5个RelativeLayout为点击区域,防止有的地方点击没反应,设置到Button上(Button的background有可能变形)
  • 封装Item点击的监听器
  • 提供显示隐藏小圆点的方法

上面的布局可以进行一点优化
这里写图片描述
查看布局层次,发现中间多了一层LinearLayout,为什么呢?
因为我们的BottomLayout本身继承自LinearLayout,而且我们在代码中这样写的

LayoutInflater.from(context).inflate(R.layout.layout_bottom, this);

又添加了一层布局,怎么优化呢?

  • 使用merge节点来消除冗余节点
    所以布局文件我们可以写成下面

    <?xml version="1.0" encoding="utf-8"?>
    <merge xmlns:android="http://schemas.android.com/apk/res/android"
    android:gravity="center"
    android:orientation="horizontal" >
    
    <RelativeLayout
        android:id="@+id/rl_home"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:clickable="true" >
    
        <ImageView
            android:id="@+id/iv_new_home"
            android:layout_width="10dp"
            android:layout_height="10dp"
            android:layout_alignParentRight="true"
            android:layout_margin="3dp"
            android:src="@drawable/read_circle" />
    
    
        <Button
            android:id="@+id/btn_home"
            android:layout_width="50dp"
            android:layout_height="50dp"
            android:layout_centerInParent="true"
            android:background="@drawable/tab_home_selector"
            android:clickable="false" />
    </RelativeLayout>
    
    <RelativeLayout
        android:id="@+id/rl_encounter"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:clickable="true" >
    
        <Button
            android:id="@+id/btn_encounter"
            android:layout_width="50dp"
            android:layout_height="50dp"
            android:layout_centerInParent="true"
            android:background="@drawable/tab_enconter_selector"
            android:clickable="false" />
    </RelativeLayout>
    
    <RelativeLayout
        android:id="@+id/rl_community"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:clickable="true" >
    
        <Button
            android:id="@+id/btn_community"
            android:layout_width="50dp"
            android:layout_height="50dp"
            android:layout_centerInParent="true"
            android:background="@drawable/tab_community_selector"
            android:clickable="false" />
    </RelativeLayout>
    
    <RelativeLayout
        android:id="@+id/rl_message"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:clickable="true" >
    
        <ImageView
            android:id="@+id/iv_new_message"
            android:layout_width="10dp"
            android:layout_height="10dp"
            android:layout_alignParentRight="true"
            android:layout_margin="3dp"
            android:src="@drawable/read_circle" />
    
        <Button
            android:id="@+id/btn_message"
            android:layout_width="50dp"
            android:layout_height="50dp"
            android:layout_centerInParent="true"
            android:background="@drawable/tab_message_selector"
            android:clickable="false" />
    </RelativeLayout>
    
    <RelativeLayout
        android:id="@+id/rl_user"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:clickable="true" >
    
        <Button
            android:id="@+id/btn_user"
            android:layout_width="50dp"
            android:layout_height="50dp"
            android:layout_centerInParent="true"
            android:background="@drawable/tab_user_selector"
            android:clickable="false" />
    </RelativeLayout>
    </merge>

    这里写图片描述
    关于merge可以看我的这篇Android 视图优化merge标签分析

下面在主界面中

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" />

    <comzyh.bottomlayout.BottomLayout
        android:id="@+id/layout_bottom"
        android:layout_width="match_parent"
        android:layout_height="56dp"
        android:layout_alignParentBottom="true"
        android:background="@android:color/darker_gray" />

</RelativeLayout>

使用自定义组合控件

public class MainActivity extends Activity {

    private BottomLayout layout_bottom;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        layout_bottom = (BottomLayout) findViewById(R.id.layout_bottom);
        layout_bottom.setOnItemClickListener(new OnItemClickListener() {
            @Override
            public void onItemClick(int position) {
                Toast.makeText(MainActivity.this, "点击了" + position, 0).show();
            }
        });

        new Handler().postDelayed(new Runnable() {
            public void run() {
                layout_bottom.showHomeCircle();
            }
        }, 5000);

        new Handler().postDelayed(new Runnable() {
            public void run() {
                layout_bottom.showMessageCircle();
            }
        }, 8000);
    }

}

源代码下载

2016-08-29 20:14:41 qq_32099621 阅读数 1209
  • 快速入门Android开发 视频 教程 android studio

    这是一门快速入门Android开发课程,顾名思义是让大家能快速入门Android开发。 学完能让你学会如下知识点: Android的发展历程 搭建Java开发环境 搭建Android开发环境 Android Studio基础使用方法 Android Studio创建项目 项目运行到模拟器 项目运行到真实手机 Android中常用控件 排查开发中的错误 Android中请求网络 常用Android开发命令 快速入门Gradle构建系统 项目实战:看美图 常用Android Studio使用技巧 项目签名打包 如何上架市场

    21575 人正在学习 去看看 任苹蜻

单选按钮组

介绍单选按钮RadioButton之前,先介绍一下单线按钮的容器RadioGroup

RadioGroup的继承于LinearLayout,它是专门用来容纳单选按钮RadioButton的容器

一个RadioGroup容器为一个单选组

RadioGroup的Orientation属性,决定选项的排列方式为横向或纵向,默认为vertical
在RadioGroup中添加RadioButton控件即可添加一个单选选项

对于RadioButton,一个RadioGroup中只有一个RadioButton可以被选中(名副其实的单选)
RadioButton的checked属性可以设定RadioButton是否被选中,默认值为false


单选项RadioButton的监听器

若要RadioButton对点击(选择)有响应必须使用它的setOnCheckedChangeListener方法绑定监听器
针对单选监听器要实现  接口
RadioGroup.OnCheckedChangeListener()
并重写该接口的onCheckedChanged方法:
public void onCheckedChanged(RadioGroup group, @IdRes int checkedId)
其中group是当前点击或进行选择的RadioGroup选项组,
checkedId是当前被选中的子项目RadioGroup的ID(对应XML)


通常在此方法中处理点击后的相应行为来对不同的子项目RadioButton进行响应

switch(checkId){
    case xxx:
    ....
    case xxx:
    ...

    ...
}



多选按钮

多选项(CheckBox)和单选项(RadioButton)不一样,不用把多个选项放到一个组中
每个CheckBox都单独是一个选项,而且可以多选
其属性checked 决定其是否被选中,默认为false


多选项CheckBox的监听器

使用CheckBox的setOnCheckedChangeListener方法来绑定监听器
监听器要实现接口
CompoundButton.OnCheckedChangeListener   (注意与RadioButton的监听器区分,属于同类中)
并实现接口的void onCheckedChanged(CompoundButton buttonView, boolean isChecked) 方法
方法中buttonView是被点击(checked属性改变)的CheckBox实例的引用,isChecked为被引用的CheckBox实例checked属性的值
这个方法可以对checked属性发生改变的CheckBox作出响应
通常会使用判断语句根据isChecked的值作出不同响应

Switch 开关

注意区分大小写(switch)
和CheckBox类似,个人认为只是外观有区别
也是使用CompoundButton.OnCheckedChangeListener 的实现类的实例作为监听器


三个控件的父类

RadioGroup,CheckBox,Switch都是抽象类CompoundButton的子类
而CompoundButton是Button的子类并实现了Checkable接口
因此Button的所有属性这三个控件都可使用 

多按钮并排

阅读数 102

没有更多推荐了,返回首页