編輯:關於android開發
首先自定義一個attrs.xml的資源文件,聲明自定義屬性
<?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="TopBar"> <attr name="titleText" format="string"></attr> <attr name="titleTextSize" format="dimension"></attr> <attr name="titleTextColor" format="reference|color"></attr> <attr name="leftButtonText" format="string"></attr> <attr name="leftButtonTextSize" format="dimension"></attr> <attr name="leftButtonBackground" format="reference|color"></attr> <attr name="rightButtonText" format="string"></attr> <attr name="rightButtonTextSize" format="dimension"></attr> <attr name="rightButtonBackground" format="reference|color"></attr> </declare-styleable> </resources>
自定義類TopBar,為簡單起見 繼承RelativeLayout
package com.sphere.topbar; 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.View; import android.view.ViewGroup; import android.widget.Button; import android.widget.RelativeLayout; import android.widget.TextView; import android.widget.Toast; public class TopBar extends RelativeLayout { private String titleText; private float titleTextSize; private int titleTextColor; private String leftButtonText; private float leftButtonTextSize; private Drawable leftButtonBackground; private String rightButtonText; private float rightButtonTextSize; private Drawable rightButtonBackground; private TextView titleTextView; private Button leftButton; private Button rightButton; private LayoutParams titleLayoutParams; private LayoutParams leftBtnLayoutParams; private LayoutParams rightBtnLayoutParams; private TopBarOnClickListener listener; // 定義點擊響應事件回調接口 interface TopBarOnClickListener{ public abstract void onLeftButtonClicked(); public abstract void onRightButtonClicked(); } @SuppressLint("NewApi") public TopBar(Context context, AttributeSet attrs) { super(context, attrs); // 得到xml文件自定的屬性集合 TypedArray ta = context.obtainStyledAttributes(attrs,R.styleable.TopBar); // 得到title的各個屬性 titleText = ta.getString(R.styleable.TopBar_titleText); titleTextSize = ta.getDimension(R.styleable.TopBar_titleTextSize, 0); titleTextColor = ta.getColor(R.styleable.TopBar_titleTextColor, 0); // 得到left button的各個屬性 leftButtonText = ta.getString(R.styleable.TopBar_leftButtonText); leftButtonTextSize = ta.getDimension(R.styleable.TopBar_leftButtonTextSize, 0); leftButtonBackground = ta.getDrawable(R.styleable.TopBar_leftButtonBackground); // 得到right button的各個屬性 rightButtonText = ta.getString(R.styleable.TopBar_rightButtonText); rightButtonTextSize = ta.getDimension(R.styleable.TopBar_rightButtonTextSize, 0); rightButtonBackground = ta.getDrawable(R.styleable.TopBar_rightButtonBackground); // initial inner basic component leftButton = new Button(context); rightButton = new Button(context); titleTextView = new TextView(context); // 設置屬性 titleTextView.setText(titleText); titleTextView.setTextSize(titleTextSize); titleTextView.setTextColor(titleTextColor); titleLayoutParams = new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT); titleLayoutParams.addRule(RelativeLayout.CENTER_IN_PARENT); titleTextView.setLayoutParams(titleLayoutParams); leftButton.setText(leftButtonText); leftButton.setTextSize(leftButtonTextSize); leftButton.setBackground(leftButtonBackground); leftBtnLayoutParams = new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT); leftBtnLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT, TRUE); leftButton.setLayoutParams(leftBtnLayoutParams); rightButton.setText(rightButtonText); rightButton.setTextSize(rightButtonTextSize); rightButton.setBackground(rightButtonBackground); rightBtnLayoutParams = new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT); rightBtnLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT, TRUE); rightButton.setLayoutParams(rightBtnLayoutParams); // 添加到View中 addView(titleTextView); addView(leftButton); addView(rightButton); //addView(View child, ViewGroup.LayoutParams params); ta.recycle(); leftButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { listener.onLeftButtonClicked(); } }); rightButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { listener.onRightButtonClicked(); } }); } /** * 類的實例調用此方法 * 以匿名內部類的形式現實接口中的方法 * @param listener */ public void setTopBarOnClickListener(TopBarOnClickListener listener){ this.listener = listener; } /** * 設置導航背景顏色 * @param color */ public void setTopBarBackgroundColor(int color){ this.setBackgroundColor(color); } /** * 設置按鈕是否可見 * @param show */ public void setLeftButtonVisible(boolean show){ leftButton.setVisibility(show ? View.VISIBLE : View.GONE); } public void setRightButtonVisible(boolean show){ rightButton.setVisibility(show ? View.VISIBLE : View.GONE); } }
需要帶 Context context, AttributeSet attrs這兩個參數的構造方法
從xml文件中得到各個屬性,並設置給對應的控件。
別忘了addView() 將內部包含的控件添加到View中
在main.xml中使用自定義控件
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" xmlns:myTopBar="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <com.sphere.topbar.TopBar android:id="@+id/topbar" android:layout_width="match_parent" android:layout_height="48dp" myTopBar:titleText="自定義標題" myTopBar:titleTextColor="#000" myTopBar:titleTextSize="10sp" myTopBar:leftButtonText="Back" myTopBar:leftButtonBackground="#ff00ff" myTopBar:leftButtonTextSize="10sp" myTopBar:rightButtonText="More" myTopBar:rightButtonBackground="#00ff00" myTopBar:rightButtonTextSize="10sp" /> </RelativeLayout>
注意要添加名稱空間,xmlns:myTopBar="http://schemas.android.com/apk/res-auto"
如果是ADT開發環境,則需要這麼寫 xmlns:myTopBar="http://schemas.android.com/apk/res/com.sphere.topbar"
注意雖然myTopBar名字可以隨便起,但是不能使用android,否則會與系統沖突,ADT中引用時 需要在res後邊接完整包名才可以。
引用自定義屬性以(myTopBar:屬性名)開頭。
MainActivity.java
package com.sphere.topbar; import android.graphics.Color; import android.support.v7.app.ActionBarActivity; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.widget.Toast; public class MainActivity extends ActionBarActivity { private TopBar mTopBar; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mTopBar = (TopBar)findViewById(R.id.topbar); mTopBar.setBackgroundColor(Color.parseColor("#46B4CD")); mTopBar.setTopBarOnClickListener(new TopBar.TopBarOnClickListener() { @Override public void onLeftButtonClicked() { Toast.makeText(MainActivity.this,"Back",Toast.LENGTH_SHORT).show(); } @Override public void onRightButtonClicked() { Toast.makeText(MainActivity.this, "More", Toast.LENGTH_SHORT).show(); } }); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); //noinspection SimplifiableIfStatement if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } }
這裡我們拿到自定義控件的實例,調用 setTopBarOnClickListener(TopBarOnClickListener listener)方法
為按鈕添加點擊事件監聽器。
效果圖如下:
機頂盒上gridview+ScrollView的使用。,gridviewscrollview最近在機頂盒上做一個gridview, 其焦點需要在item的子控件上,但g
android 項目 分享圖片到微信 慕課網學習項目 android 項目 分享圖片到微信 AlertDialog 對話框設置 .9.png的編輯及使用 sdk-&
Android基礎入門教程——10.8 LayoutInflater(布局服務) Android基礎入門教程——10.8 LayoutInflat
搭建流媒體服務器需求:現在需要搭建一台流媒體服務器,為了將主講人的電腦桌面屏幕和聲音直播給遠端的人接收實時觀看,要求延遲在5秒左右。理論上RTSP、RTMP、HTTP都可