文档章节

android中自定义布局文件

ixsai
 ixsai
发布于 2014/12/05 19:46
字数 744
阅读 61
收藏 0

1.在values下新建xml文件为atts.xml,内容如下,declare-styleable声明自定义控件,name="Topbar" 定义控件的名字,<attr/>里面都是自定义的属性  name="属性名字" formar="属性的类型"

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

    <declare-styleable name="Topbar">
        <attr name="title" format="string"/>
        <attr name="titleTextSize" format="dimension"/>
        <attr name="titleTextColor" format="color"/>
       
        <attr name="leftText" format="string"/>
        <attr name="leftTextColor" format="color"/>
        <attr name="leftBackground" format="reference|color"/>
       
        <attr name="rightText" format="string"/>
        <attr name="rightTextColor" format="color"/>
        <attr name="rightBackground" format="reference|color"/>
    </declare-styleable>

</resources>

2.定义一个类Topbar继承自RelativeLayout

package xss.customview;

import android.annotation.SuppressLint;
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.view.ViewGroup;
import android.widget.Button;
import android.widget.RelativeLayout;
import android.widget.TextView;

public class Topbar extends RelativeLayout {

 private Button leftButton, rightButton;
 private TextView tvTitle;

 private int leftTextColor;
 private Drawable leftBackground;
 private String leftText;

 private int rightTextColor;
 private Drawable rightBackground;
 private String rightText;

 private String title;
 private int titleTextColor;
 private float tilteTextSize;

 // 定义接口回掉方法
 private topbarClickListener listener;

 //自定义接口
 public interface topbarClickListener {
  public void leftClick();

  public void rightClick();
 }

 //接口的实现方法
 public void setOnTopbarClickListener(topbarClickListener listener) {
  this.listener = listener;
 }

 private LayoutParams leftParams, rightParams, titleParams;

 // 利用构造函数从定义的xml文件中得到属性值
 @SuppressLint("NewApi")
 public Topbar(Context context, AttributeSet attrs) {
  super(context, attrs);
  // TODO Auto-generated constructor stub
  // 获取属性值
  TypedArray ta = context.obtainStyledAttributes(attrs,
    R.styleable.Topbar);

  leftText = ta.getString(R.styleable.Topbar_leftText);
  leftTextColor = ta.getColor(R.styleable.Topbar_leftTextColor, 0);
  leftBackground = ta.getDrawable(R.styleable.Topbar_leftBackground);

  rightText = ta.getString(R.styleable.Topbar_rightText);
  rightTextColor = ta.getColor(R.styleable.Topbar_rightTextColor, 0);
  rightBackground = ta.getDrawable(R.styleable.Topbar_rightBackground);

  title = ta.getString(R.styleable.Topbar_title);
  tilteTextSize = ta.getDimension(R.styleable.Topbar_titleTextSize, 0);
  titleTextColor = ta.getColor(R.styleable.Topbar_titleTextColor, 0);

  ta.recycle();// 及时回收,避免浪费资源,避免有些缓存造成的错误

  // 处理定义的控件,为控件设置属性
  leftButton = new Button(context);
  rightButton = new Button(context);
  tvTitle = new TextView(context);

  leftButton.setBackground(leftBackground);
  leftButton.setText(leftText);
  leftButton.setTextColor(leftTextColor);

  rightButton.setBackground(rightBackground);
  rightButton.setText(rightText);
  rightButton.setTextColor(rightTextColor);

  tvTitle.setText(title);
  tvTitle.setTextSize(tilteTextSize);
  tvTitle.setTextColor(titleTextColor);
  tvTitle.setGravity(Gravity.CENTER);

  setBackgroundColor(0xFFF59563);// 设置背景颜色

  // 把自定义的控件添加到布局当中
  leftParams = new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,
    LayoutParams.WRAP_CONTENT);
  leftParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT, TRUE);
  addView(leftButton, leftParams);

  rightParams = new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,
    LayoutParams.WRAP_CONTENT);
  rightParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT, TRUE);
  addView(rightButton, rightParams);

  titleParams = new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,
    LayoutParams.MATCH_PARENT);
  titleParams.addRule(RelativeLayout.CENTER_IN_PARENT, TRUE);
  addView(tvTitle, titleParams);

  leftButton.setOnClickListener(new OnClickListener() {

   @Override
   public void onClick(View v) {
    // TODO Auto-generated method stub
    listener.leftClick();//调用自定义接口里面的方法
   }
  });
  rightButton.setOnClickListener(new OnClickListener() {

   @Override
   public void onClick(View v) {
    // TODO Auto-generated method stub
    listener.rightClick();//调用自定义接口里面的方法
   }
  });
 }
 
 //设置按钮是否可见
 public void setLeftButtonIsVisable(boolean flag){
  if(flag){
   leftButton.setVisibility(View.VISIBLE);
  }else{
   leftButton.setVisibility(View.GONE);
  }
 }

}

3.在布局文件中引用自定义的控件布局

 其中app为命名空间,加上xmlns:app="http://schemas.android.com/apk/res/xss.customview"才能引用自定义的属性

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res/xss.customview"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

    <xss.customview.Topbar
        android:id="@+id/topbar"
        android:layout_width="match_parent"
        android:layout_height="40dp"
        app:leftText="Back"
        app:leftTextColor="#000000"
        app:leftBackground="@drawable/button_bg"
        app:rightText="Click"
        app:rightTextColor="#FFFFFF"
        app:rightBackground="@drawable/button_bg"
        app:title="自定义标题"
        app:titleTextSize="12sp"
        app:titleTextColor="#123412" >
    </xss.customview.Topbar>

</RelativeLayout>

 4.MainActivity里面的实现如下

package xss.customview;

import xss.customview.Topbar.topbarClickListener;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;

public class MainActivity extends Activity {

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  Topbar topbar = (Topbar) findViewById(R.id.topbar);
  topbar.setOnTopbarClickListener(new topbarClickListener() {
   
   @Override
   public void rightClick() {
    // TODO Auto-generated method stub
    Toast.makeText(MainActivity.this, "RIGHT", Toast.LENGTH_SHORT).show();
   }
   
   @Override
   public void leftClick() {
    // TODO Auto-generated method stub
    Toast.makeText(MainActivity.this, "LEFT", Toast.LENGTH_SHORT).show();
   }
  });
  
  topbar.setLeftButtonIsVisable(false);//false 为不可见
 }

}

 

 

© 著作权归作者所有

ixsai
粉丝 0
博文 22
码字总数 20027
作品 0
郑州
程序员
私信 提问
Android自定义控件实现及其布局

Android自定义控件实现及其布局 Android自定义控件一般要继承View类,因此控件的实现及其相应的布局需要完成: 1. 继承View类,并实现参数为(Context context,AttributeSet attrs)的构造函数...

长平狐
2012/10/08
6.1K
0
如何自定义LinearLayout

最近通过看别人代码和网上搜索,发现现在自定义LinearLayout的方式有两种。第一种是在扩展的LinearLayout构造函数中使用Inflater加载一个布局,并从中提取出相关的UI组件进行封装,形成一个独...

Kingguary
2012/06/25
5.1K
0
Android 自定义组合控件小结

引言 接触Android UI开发的这段时间以来,对自定义组合控件有了一定的了解,为此小结一下,本文小结内容主要讨论的是如何使用Android SDK提供的布局和控件组成一个功能完整组合控件并将其封装...

程序袁_绪龙
2014/09/24
310
0
分享:Android之自定义标题

我们知道我们创建的每一个Activity,系统默认为我们提供了一下黑色的标题,本篇我将带领大家接触一下如何实现自定义标题样式。相比系统为我们提供的样式,自定义标题可以满足我们唯心所欲的自...

红豆与绿豆
2015/11/10
58
0
Layout resource(布局资源)-----官网翻译

布局资源在UI的活动或组件中定义UI的体系结构。 file location:(文件位置) 文件名将用作资源ID 编制资源数据类型: 指向视图(或子类)资源的资源指针。 资源引用: In Java: In XML: 语法: ...

嘿嘿嘿IT
03/29
3
0

没有更多内容

加载失败,请刷新页面

加载更多

Java 中的 String 有没有长度限制

转载: https://juejin.im/post/5d53653f5188257315539f9a String是Java中很重要的一个数据类型,除了基本数据类型以外,String是被使用的最广泛的了,但是,关于String,其实还是有很多东西...

低至一折起
21分钟前
8
0
OpenStack 简介和几种安装方式总结

OpenStack :是一个由NASA和Rackspace合作研发并发起的,以Apache许可证授权的自由软件和开放源代码项目。项目目标是提供实施简单、可大规模扩展、丰富、标准统一的云计算管理平台。OpenSta...

小海bug
昨天
10
0
DDD(五)

1、引言 之前学习了解了DDD中实体这一概念,那么接下来需要了解的就是值对象、唯一标识。值对象,值就是数字1、2、3,字符串“1”,“2”,“3”,值时对象的特征,对象是一个事物的具体描述...

MrYuZixian
昨天
6
0
解决Mac下VSCode打开zsh乱码

1.乱码问题 iTerm2终端使用Zsh,并且配置Zsh主题,该主题主题需要安装字体来支持箭头效果,在iTerm2中设置这个字体,但是VSCode里这个箭头还是显示乱码。 iTerm2展示如下: VSCode展示如下: 2...

HelloDeveloper
昨天
9
0
常用物流快递单号查询接口种类及对接方法

目前快递查询接口有两种方式可以对接,一是和顺丰、圆通、中通、天天、韵达、德邦这些快递公司一一对接接口,二是和快递鸟这样第三方集成接口一次性对接多家常用快递。第一种耗费时间长,但是...

程序的小猿
昨天
11
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部