开发项目时发现页面顶部都是高度一致的,直接上图
都是一个返回键,加一个文本框 后边一坨textview和图标。
最开始时候是把这个布局文件抽取出来了,在页面中用include方式引入。但是这样还是需要处理返回键逻辑和链接WiFi逻辑。于是决定自定义组合控件
步骤如下:
先建一个topview类,继承LinearLayout
public class TopView extends LinearLayout
创建构造方法,把布局文件引进来
public TopView(Context context, AttributeSet attrs) { super(context, attrs); LayoutInflater.from(context).inflate(R.layout.top_views, this); }
编写布局文件
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/black" android:id="@+id/top_view" android:orientation="horizontal"> <ImageView android:layout_width="wrap_content" android:layout_height="match_parent" android:src="@drawable/iconback"> </ImageView> <TextView android:id="@+id/back" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="返回" android:layout_gravity="center_vertical" android:textColor="@color/Yellow"> </TextView> <TextView android:id="@+id/title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="" android:layout_gravity="center_vertical" android:gravity="center_horizontal" android:layout_weight="1" android:textColor="@color/white"> </TextView> <TextView android:id="@+id/connect_wifi" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:text="连接WiFi " android:textColor="@color/white"> </TextView> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:text="通讯 : " android:textColor="@color/white"> </TextView> <TextView android:id="@+id/communication_among" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:text="" android:textColor="@color/white"> </TextView> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text=" " android:layout_gravity="center_vertical" android:textColor="@color/white"> </TextView> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="uBox : " android:layout_gravity="center_vertical" android:textColor="@color/white"> </TextView> <TextView android:id="@+id/ubox_condition" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="" android:layout_gravity="center_vertical" android:textColor="@color/white"> </TextView> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text=" " android:layout_gravity="center_vertical" android:textColor="@color/white"> </TextView> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/iconmenu"> </ImageView> </LinearLayout>
说明:这里采用线性布局,横向排列的,用到
android:orientation=”horizontal
属性,中间标题文本框设置权重为1填满剩余空间,另外加上
android:layout_gravity=”center_vertical” android:gravity=”center_horizontal”
这两个属性,文字上下左右都居中。大家可以看到有两个地方我是写了空的textview这里主要是让跟上个文本框有间隔,textview的text属性字符串后边加空格可以显示,前面直接空格是不显示的,又不想在Java代码中处理这个 故采用这种方式。
在topview中初始化控件
private void init() { back = findViewById(R.id.back); back.setOnClickListener(this); connectWifi = findViewById(R.id.connect_wifi); connectWifi.setOnClickListener(this); title = findViewById(R.id.title); communicationAmong = findViewById(R.id.communication_among); uboxCondition = findViewById(R.id.ubox_condition); }
编写给文本框设置text方法
public void setTitle(String s) { title.setText(s); }
处理点击事件
@Override public void onClick(View view) { switch (view.getId()) { case R.id.back: ((Activity)getContext()).finish(); break; case R.id.connect_wifi: Intent in = new Intent(); in.setAction("android.net.wifi.PICK_WIFI_NETWORK"); getContext().startActivity(in); break; default: break; } }
完整代码如下
package com.example.recanapp; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.media.Image; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.View; import android.widget.LinearLayout; import android.widget.TextView; public class TopView extends LinearLayout implements View.OnClickListener { private TextView back; private TextView title; private TextView connectWifi; private TextView communicationAmong; private TextView uboxCondition; public TopView(Context context, AttributeSet attrs) { super(context, attrs); LayoutInflater.from(context).inflate(R.layout.top_views, this); init(); } private void init() { back = findViewById(R.id.back); back.setOnClickListener(this); connectWifi = findViewById(R.id.connect_wifi); connectWifi.setOnClickListener(this); title = findViewById(R.id.title); communicationAmong = findViewById(R.id.communication_among); uboxCondition = findViewById(R.id.ubox_condition); } public void setTitle(String s) { title.setText(s); } public void setCommunicationAmong(String s) { communicationAmong.setText(s); } public void setUboxCondition(String s) { uboxCondition.setText(s); } @Override public void onClick(View view) { switch (view.getId()) { case R.id.back: ((Activity)getContext()).finish(); break; case R.id.connect_wifi: Intent in = new Intent(); in.setAction("android.net.wifi.PICK_WIFI_NETWORK"); getContext().startActivity(in); break; default: break; } } }
自定义组合控件就好了,直接在activity里面引入使用就ok
在xml文件中引入控件
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <com.example.recanapp.TopView android:id="@+id/top_view" android:layout_width="match_parent" android:layout_height="wrap_content"/> </LinearLayout>
在activity里面初始化该空间调用topView.setTitle(“cyc”);给文本框赋值
package com.example.recanapp.sjjk; import android.os.Bundle; import com.example.recanapp.BaseActivity; import com.example.recanapp.R; import com.example.recanapp.TopView; public class BightPatternActivity extends BaseActivity { private TopView topView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.bight_pattern_activity); topView = findViewById(R.id.top_view); topView.setTitle("cyc"); topView.setCommunicationAmong("cyc"); topView.setUboxCondition("cyc"); } }
效果图如下