您的位置:首页 > 移动开发 > Android开发

Android学习十二:自定义控件学习

2015-06-09 23:59 337 查看
自定义控件:

1.定义控件的属性,atts.xml

2.代码实现自定义控件的控制

3.引用该控件

首先定义相关的属性

<?xml version="1.0" encoding="utf-8"?>
<resources>

<declare-styleable name="TopBar">
<!-- title提示已经定义,那就直接引用 -->
<attr name="title" />
<attr name="titleTextSize" format="string" />
<attr name="titleTextColor" format="reference|color" />
<attr name="leftTextColor" format="reference|color" />
<attr name="leftBgColor" format="reference|color" />
<attr name="leftText" format="string" />
<attr name="rightTextColor" format="color" />
<attr name="rightBgColor" format="reference|color" />
<attr name="rightText" format="string" />
</declare-styleable>

</resources>


然后,设置控件布局

package org.tonny;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.View;
import android.widget.Button;
import android.widget.RelativeLayout;
import android.widget.TextView;

public class TopBar extends RelativeLayout
{
//自定义控件中包含的控件
private Button mLeftButton;
private Button mRightButton;
private TextView mTextView;

//自定义控件布局的设置
private LayoutParams mLeftParams;
private LayoutParams mRightParams;
private LayoutParams mCenterParams;

//定义成员,与atts中的对应,对应mLeftButton
private int mLeftTextColor;
private Drawable mLeftBackground;
private String mLeftText;

//对应mRightButton
private int mRightTextColor;
private Drawable mRightBackground;
private String mRightText;

//对应mTextView
private int mTitleTextSize;
private int mTitleTextColor;
private String mTitle;

//定义接口,用于回调事件
private onTopbarClickListener mLlistener;

public TopBar(Context context, AttributeSet attrs)
{
super(context, attrs);

// 获取属性,将xml中值映射到ta中
TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.TopBar);

mLeftTextColor = ta.getColor(R.styleable.TopBar_leftTextColor, 0);
mLeftBackground = ta.getDrawable(R.styleable.TopBar_leftBgColor);
mLeftText = ta.getString(R.styleable.TopBar_leftText);

mRightTextColor = ta.getColor(R.styleable.TopBar_rightTextColor, 0);
mRightBackground = ta.getDrawable(R.styleable.TopBar_rightBgColor);
mRightText = ta.getString(R.styleable.TopBar_rightText);

mTitleTextColor = ta.getColor(R.styleable.TopBar_titleTextColor, 0);
mTitle = ta.getString(R.styleable.TopBar_title);

// 注意回收,这个很重要
ta.recycle();

// 设置相应控件的属性
mLeftButton = new Button(context);
mLeftButton.setTextColor(mLeftTextColor);
mLeftButton.setBackgroundDrawable(mLeftBackground);
mLeftButton.setText(mLeftText);

//注意这个地方的使用
mLeftButton.setOnClickListener(new OnClickListener()
{

@Override
public void onClick(View v)
{
mLlistener.leftClick();

}
});

mRightButton = new Button(context);
mRightButton.setTextColor(mRightTextColor);
mRightButton.setBackgroundDrawable(mRightBackground);
mRightButton.setText(mRightText);
mRightButton.setOnClickListener(new OnClickListener()
{

@Override
public void onClick(View v)
{
mLlistener.rightClick();

}
});

mTextView = new TextView(context);

// 这个地方使用浮点数的形式会出错,不知道为啥
mTextView.setTextSize(mTitleTextSize);
mTextView.setTextColor(mTitleTextColor);
mTextView.setText(mTitle);
mTextView.setGravity(Gravity.CENTER);

// 将控件添加到viewgroup中

// 添加左按钮到布局中
mLeftParams = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
mLeftParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT, TRUE);
addView(mLeftButton, mLeftParams);

// 添加右按钮到布局中
mRightParams = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
mRightParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT, TRUE);
addView(mRightButton, mRightParams);

// 添加标题到布局中
mCenterParams = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT);
mCenterParams.addRule(RelativeLayout.CENTER_IN_PARENT, TRUE);
addView(mTextView, mCenterParams);
}

public void setOnTopbarClickListener(onTopbarClickListener listener)
{
mLlistener = listener;
}
}


接口代码

package org.tonny;

//定义接口,用于回调
public interface onTopbarClickListener
{
public void leftClick();

public void rightClick();
}


其次,引用

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:bar="http://schemas.android.com/apk/res/org.tonny"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="${relativePackage}.${activityClass}" >

<!-- 注意 xmlns:bar="http://schemas.android.com/apk/res/org.tonny"    命名空间的使用,bar是引入的控件的别名,可以自己定义因为需要引用自定义的leftBgColor,所以需要设置这个引用空间 -->

<org.tonny.TopBar
android:id="@+id/topBar"
android:layout_width="match_parent"
android:layout_height="40dp"
bar:leftBgColor="#F00FFF"
bar:leftText="Back"
bar:leftTextColor="#FFFFFF"
bar:rightBgColor="#F00FFF"
bar:rightText="More"
bar:rightTextColor="#FFFFFF"
bar:title="自定义控件测试"
bar:titleTextColor="#00FFFF"
bar:titleTextSize="40sp" >
</org.tonny.TopBar>

</RelativeLayout>


最后,测试

package org.tonny;

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

public class MainActivity extends Activity
{
private TopBar mTopbar;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

//获取topbar控件
mTopbar = (TopBar) findViewById(R.id.topBar);

//设置mTopbar的点击事件
mTopbar.setOnTopbarClickListener(new onTopbarClickListener()
{

@Override
public void rightClick()
{
Toast.makeText(MainActivity.this, "more clicked", Toast.LENGTH_SHORT).show();

}

@Override
public void leftClick()
{
Toast.makeText(MainActivity.this, "back clicked", Toast.LENGTH_SHORT).show();

}
});
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: