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"/>       


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章