Android 自定义TopBar的复用

自定义TopBar的复用


       从来没发过关于android的技术文档,其实自己最近一个月都在学习java,但是感觉学java不学界面编程,没啥意思,所以傻傻的学了下AWT编程,结果发现这什么玩意啊,浪费青春,现在哪还有用java做pc端的呀,不说废话,赶紧学习android,不然这个月又白忙活了。

       其实这个自定义TopBar呢,以前考核的时候基本上没时间去弄,因为要写很多属性,相信你看下面的一堆堆看似重复的代码会一脸懵X,其实也就是左按钮,标题,右按钮的属性设置,什么大小啊,字体颜色啊,字体大小啊,背景啊,统统都得写,所以才叫的上“自定义”嘛。我做得这么难看,相信你做得比我好。

  • /res/values/attrs.xml
    • <?xml version="1.0" encoding="utf-8"?>
      <resources>
          <declare-styleable name="TopBar">
              <attr name="titleText" format="string"/>
              <attr name="titleSize" format="dimension"/>
              <attr name="titleColor" format="color"/>
      
              <attr name="leftTextColor" format="color"/>
              <attr name="leftBackground" format="reference|color"/>
              <attr name="leftText" format="string"/>
      
              <attr name="rightTextColor" format="color"/>
              <attr name="rightBackground" format="reference|color"/>
              <attr name="rightText" format="string"/>
          </declare-styleable>
      </resources>

    • <declare-styleable>:声明使用自定义属性,并通过name属性来确定引用的名称
      <attr>:声明具体的自定义属性,标题文字字体、大小、颜色、背景
      fomat:属性来指定属性的类型,多种属性可用”|“分隔开

  • XML文件
    • <?xml version="1.0" encoding="utf-8"?>
      <LinearLayout
          xmlns:android="http://schemas.android.com/apk/res/android"
          xmlns:app="http://schemas.android.com/apk/res-auto"        //这个表示下面可以用app开头,命名空间
          android:layout_width="match_parent"
          android:orientation="vertical"
          android:layout_height="match_parent"
          >
          <com.android.rdc.view.TopBar
              android:id="@+id/topbar"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              app:leftText="返回"
              app:leftBackground="@color/colorPrimaryDark"
              app:leftTextColor="@color/colorAccent"
              app:rightText="下一步"
              app:rightTextColor="@color/colorAccent"
              app:rightBackground="@color/colorPrimaryDark"
              app:titleText="TopBar"
              app:titleColor="@color/colorAccent"
              app:titleSize="13sp"
              >
          </com.android.rdc.view.TopBar>
      </LinearLayout>


  • TopBar的代码实现
    • public class TopBar extends RelativeLayout {
      private int mLeftTextColor;
      private Drawable mLeftBackground;
      private String mLeftText;
      private int mRightTextColor;
      private Drawable mRightBackground;
      private String mRightText;
      private String mTitleText;
      private int mTitleColor;
      private float mTitleSize;
      private Button leftBtn;
      private LayoutParams leftParams;
      private Button rightBtn;
      private LayoutParams rightParams;
      private LayoutParams titleParams;
      private TopBarListener listener;

      public interface TopBarListener { //接口对象,实现回调机制,不考虑实现
      public void leftClick();
      public void rightClick();
      }
      public void setListener(TopBarListener topBarListener) {
      this.listener = topBarListener;
      }

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

      //系统提供了TypedArray数据结构来获取自定义属性集
      TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.TopBar);
      mLeftTextColor = ta.getColor(R.styleable.TopBar_leftTextColor, 0);
      mLeftBackground = ta.getDrawable(R.styleable.TopBar_leftBackground);
      mLeftText = ta.getString(R.styleable.TopBar_leftText);
      mRightTextColor = ta.getColor(R.styleable.TopBar_rightTextColor, 0);
      mRightBackground = ta.getDrawable(R.styleable.TopBar_rightBackground);
      mRightText = ta.getString(R.styleable.TopBar_rightText);
      mTitleColor = ta.getColor(R.styleable.TopBar_titleColor, 0);
      mTitleSize = ta.getDimension(R.styleable.TopBar_titleSize, 10);
      mTitleText = ta.getString(R.styleable.TopBar_titleText);

      ta.recycle(); //当获取完所有的属性值后,要使用recycle()来完成资源的回收
      leftBtn = new Button(context);
      leftBtn.setText(mLeftText);
      leftBtn.setTextColor(mLeftTextColor);
      leftBtn.setBackground(mLeftBackground);
      leftParams = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
      leftParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
      addView(leftBtn, leftParams);
      rightBtn = new Button(context);
      rightBtn.setText(mRightText);
      rightBtn.setTextColor(mRightTextColor);
      rightBtn.setBackground(mRightBackground);
      rightParams = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
      rightParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
      addView(rightBtn, rightParams);
      TextView tvTitle = new TextView(context);
      tvTitle.setText(mTitleText);
      tvTitle.setTextColor(mTitleColor);
      tvTitle.setTextSize(mTitleSize);
      tvTitle.setGravity(Gravity.CENTER);
      titleParams = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
      titleParams.addRule(RelativeLayout.CENTER_IN_PARENT);
      addView(tvTitle, titleParams);
      leftBtn.setOnClickListener(new OnClickListener() { //按钮的点击事件
      @Override
      public void onClick(View view) {
      listener.leftClick();
      }
      });

      rightBtn.setOnClickListener(new OnClickListener() {
      @Override
      public void onClick(View view) {
      listener.rightClick();
      }
      });
      }
      }

  • MainActivity
    • public class MainActivity extends AppCompatActivity {
      
         @Override
         protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            requestWindowFeature(Window.FEATURE_NO_TITLE);
            setContentView(R.layout.activity_main);
            TopBar topBar = (TopBar) findViewById(R.id.topbar);
            topBar.setListener(new TopBar.TopBarListener() {             //回调机制,实现按钮的点击
               @Override
               public void leftClick() {
                  Toast.makeText(MainActivity.this, "left", Toast.LENGTH_SHORT).show();
               }
      
               @Override
               public void rightClick() {
                  Toast.makeText(MainActivity.this, "right", Toast.LENGTH_SHORT).show();
               }
            });
         }
      

  • 后续的乱入
    • 通过include加入到其他布局
    • <include layout="@layout/topbar"/>       


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值