android 原理 组合控件_Android_组合方式自定义控件
用組合的方式自定義一個導航欄,功能:
左邊個back被點擊時,用監聽的方式告訴系統自己被點擊了了;右邊個back被點擊時,進入下一個界面。
a.png
在MainActivity中用代碼實現:
定義一個xml資源文件,定義button控件的背景顏色和形狀
android:shape="rectangle">
定義一個wll類,繼承于RelativeLayout ,用于定義倆個button的屬性
import android.content.Context;
import android.graphics.Color;
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 androidx.core.content.res.ResourcesCompat;
public class wll extends RelativeLayout {
// 將兩個控件全局化、私有化
private Button back_button;
private Button back_button1;
// 定義控件監聽者
private backButtonDidClickedListener listener;
// 實現RelativeLayout 的兩個必須實現的方法
public wll(Context context) {
this(context,null);
}
public wll(Context context, AttributeSet attrs) {
super(context, attrs);
init(context,attrs);
}
public void init(Context context, AttributeSet attrs){
setBackgroundColor(Color.MAGENTA);
setBack_button(back_button);
setBack_button1(back_button1);
}
// 實現button的set、get方法
public void setBack_button(Button back_button) {
this.back_button = back_button;
// 創建控件
back_button = new Button(getContext());
// 創建button的布局
LayoutParams params = new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
params.leftMargin = (int)(10 * getResources().getDisplayMetrics().density);
params.topMargin = (int)(10 * getResources().getDisplayMetrics().density);
// 取出之前定義的xml資源文件,用于設置button的背景
Drawable drawable1 = ResourcesCompat.getDrawable(getResources(), R.drawable.back_shape, null);
back_button.setBackground(drawable1);
back_button.setText("Back");
// 給button添加監聽事件
back_button.setOnClickListener(new OnClickListener() {
// 給button添加點擊事件
@Override
public void onClick(View view) {
if (listener != null) {
listener.ButtonDidClicked();
}
}
});
// 添加控件
addView(back_button,params);
}
public void setBack_button1(Button back_button1) {
this.back_button1 = back_button1;
back_button1 = new Button(getContext());
LayoutParams params = new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
params.leftMargin = (int)(300 * getResources().getDisplayMetrics().density);
params.topMargin = (int)(10 * getResources().getDisplayMetrics().density);
Drawable drawable1 = ResourcesCompat.getDrawable(getResources(), R.drawable.back_shape, null);
back_button1.setBackground(drawable1);
back_button1.setText("Back");
back_button1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
if (listener != null) {
listener.changeMainActivity();
}
}
});
addView(back_button1,params);
}
public Button getBack_button() {
return back_button;
}
public Button getBack_button1() {
return back_button;
}
// 定義接口
public interface backButtonDidClickedListener{
void ButtonDidClicked();
void changeMainActivity();
}
// 添加監聽者
public void addbackButtonDidClickedListener(backButtonDidClickedListener listener){
this.listener = listener;
}
}
在MainActivity中調用wll類實現具體的功能
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 定義一個wll類的對象
wll yk = new wll(this);
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,200);
// 實現接口定義的兩個方法
yk.addbackButtonDidClickedListener(new wll.backButtonDidClickedListener() {
@Override
public void ButtonDidClicked() {
System.out.println("被點擊了");
}
@Override
public void changeMainActivity() {
goToNext();
}
});
setContentView(yk,params);
}
// 跳轉界面
public void goToNext(){
// 創建一個intent,確定跳轉的界面
// intent:意圖
// 顯式意圖(調到自己的界面)、隱式意圖(調到別人的界面中)我定義的第二個界面命名為:Main2Activity
Intent intent = new Intent(this, Main2Activity.class);
// 跳轉
startActivity(intent);
}
}
使用xml的方式實現:
首先展示效果圖:
展示Back
不展示Back
創建一個wll類,繼承于LinearLayout
public class wll extends LinearLayout {
// 全局化三個button
private Button back1;
private Button back2;
private Button back3;
private boolean isShowBack = false;
int state = 0;
// 繼承LinearLayout 中的方法
public wll(Context context) {
this(context,null);
}
public wll(Context context, AttributeSet attrs) {
super(context, attrs);
init(context,attrs);
}
private void init(Context context, AttributeSet attrs) {
setOrientation(LinearLayout.HORIZONTAL);
setBackgroundColor(Color.GRAY);
boolean isShow1 = false;
// 獲取自定義的屬性
if (attrs != null) {
TypedArray array =context.obtainStyledAttributes(attrs,R.styleable.wll1);
isShow1 = array.getBoolean(R.styleable.wll1_isShow_back,true);
}
// 調用button控件的set方法,并將自定義的屬性傳遞給控件(只有back1使用了自定義的屬性)
setBack1(back1,isShow1);
setBack2(back2);
setBack3(back3);
}
// 實現控件的set、get方法
public void setBack1(Button back1,boolean isShow) {
this.back1 = back1;
// 自定義的屬性如果為true,顯示控件back1,否則不顯示
if (isShow == true) {
// 調用自定義的創建控件的方法
initButton(back1,"Back",5);
}
}
public void setBack2(Button back2) {
this.back2 = back2;
// 調用自定義的創建控件的方法
initButton(back2,"主頁",65);
}
public void setBack3(Button back3) {
this.back3 = back3;
// 調用自定義的創建控件的方法
initButton(back3,"跳轉",65);
}
public Button getBack1() {
return back1;
}
public Button getBack2() {
return back2;
}
public Button getBack3() {
return back3;
}
// 封裝創建控件的方法,需要參數:button、button的標題、button之間的間距
public void initButton(Button button,String text,int margin){
button = new Button(getContext());
button.setText(text);
LinearLayout.LayoutParams params = new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
params.leftMargin = (int)(margin * getResources().getDisplayMetrics().density);
addView(button,params);
}
創建自定義屬性的xml文件:
在MainActivity_xml中調用wll類:
android:layout_width="match_parent"
android:layout_height="100dp"
app:isShow_back = "false"
/>
總結
以上是生活随笔為你收集整理的android 原理 组合控件_Android_组合方式自定义控件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: element ui分页怎么做_elem
- 下一篇: python网络信息提取_Python网