Android多Activity通用Title

本文介绍如何通过创建抽象类BaseActivity来实现在所有页面显示相同标题的方法,包括XML布局引入、主题和ActionBarActivity的替代品以及面向对象思想的应用。
先看一下效果图:

[img]http://dl2.iteye.com/upload/attachment/0108/7371/2fee2a0e-4600-3532-b8cb-6b291d0c7f77.png[/img]

要实现在每个页面显示相同的Title,能想到的办法有:
1、创建单独的xml布局文件,在页面主配置文件中用include标签引入,如果要修改内容,可以再代码中获取View,修改内容;
2、用Android提供的Theme(在新建项目时可选),toolbar ,ActionBarActivity可以实现现在流行的material design,不过ActionBarActivity已经被AppCompatActivity取代了;
3、在1的基础上引入面向对象的思想,抽象出基类Activity(Fragment)。

下面记录一下3的实现过程:
1、新建抽象的Activity:

public abstract class BaseActivity extends Activity {

public static List<WeakReference<BaseActivity>> baseActivityList = new ArrayList<WeakReference<BaseActivity>>();

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
WeakReference<BaseActivity> ba = new WeakReference<BaseActivity>(this);
baseActivityList.add(ba);
}

@Override
public void setContentView(int layoutResID) {
View contentView = LayoutInflater.from(this).inflate(layoutResID, null);
setContentView(contentView);
}

@Override
public void setContentView(View view) {
// TODO Auto-generated method stub
setContentView(view,null);
}

@Override
public void setContentView(View view,ViewGroup.LayoutParams lp) {
boolean hasTitle = hasTitle();
if(hasTitle){
int titleLayoutId = getCustomTitleLayoutId();
requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);
if(lp == null){
super.setContentView(view);
}else{
super.setContentView(view, lp);
}

Window w = getWindow();
w.setFeatureInt(Window.FEATURE_CUSTOM_TITLE, titleLayoutId);
Drawable titleBg = getTitleBg();
if(titleBg != null){
ViewGroup titleGroup = (ViewGroup)findViewById(R.id.title_root_group);
titleGroup.setBackgroundDrawable(titleBg);
}

initTitle();
}else{
requestWindowFeature(Window.FEATURE_NO_TITLE);
if(lp == null){
super.setContentView(view);
}else{
super.setContentView(view, lp);
}
}

}

/**
* 初始化View,分三部分:
* Left、Center、Right:可以设置图片、文字、点击事件
*/
private void initTitle(){
titleLeftTV = (TextView)findViewById(R.id.title_left_tv);
titleLeftIV = (ImageView)findViewById(R.id.title_left_iv);
titleNameTV = (TextView)findViewById(R.id.title_name_tv);
titleRightTV = (TextView)findViewById(R.id.title_right_tv);
titleRightIV = (ImageView)findViewById(R.id.title_right_iv);
//下面三个方法根据自己的要求实现;
setTitleLeftView();
setTitleNameView();
setTitleRightView();
}

/**
* 是否显示Title,子类可以重写;
* @return
*/
protected boolean hasTitle(){
return true;
}

/**
* Title布局文件;
* @return
*/
protected int getCustomTitleLayoutId(){
return R.layout.custom_common_title;
}

/**
* Title背景,子类可以重写;
* @return
*/
protected Drawable getTitleBg(){
return null;
}


@Override
protected void onDestroy() {
super.onDestroy();
for (int i = 0; i < baseActivityList.size(); i++) {
WeakReference<BaseActivity> ba = baseActivityList.get(i);
if (ba != null && null != ba.get() && ba.get() == this) {
baseActivityList.remove(i);
}
}
}
}


其他页面Activity只要继承此BaseActivity即可;
### Android通用 Dialog 的实现与使用 在 Android 开发中,`Dialog` 是一种用于显示临时交互窗口的小型界面组件。通过创建自定义 `Dialog` 或扩展其功能,可以满足种需求场景下的弹窗设计。 #### 使用内置的 AlertDialog 实现简单对话框 Android 提供了一个强大的工具类 `AlertDialog.Builder` 来快速构建标准样式对话框。以下是基本用法: ```java // 创建并配置一个简单的AlertDialog实例 new AlertDialog.Builder(context) .setTitle("提示") // 设置标题 .setMessage("这是一个简单的对话框示例。") // 设置消息内容 .setPositiveButton("确认", (dialog, which) -> { // 用户点击“确认”按钮后的逻辑处理 }) .setNegativeButton("取消", (dialog, which) -> { // 用户点击“取消”按钮后的逻辑处理 }) .show(); // 显示对话框 ``` 此代码片段展示了如何利用 `AlertDialog.Builder` 构建具有两个操作按钮的标准对话框[^3]。 #### 自定义布局的 Generic Dialog 设计 当需要更复杂的 UI 结构时,可以通过加载自定义 XML 布局文件来增强灵活性。下面是一个例子: 1. 首先,在 res/layout 文件夹下新建名为 custom_dialog.xml 的资源文件: ```xml <!-- 定义自定义对话框UI --> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:padding="10dp" android:layout_width="match_parent" android:layout_height="wrap_content"> <TextView android:id="@+id/dialogTitle" android:textSize="18sp" android:gravity="center_horizontal" android:layout_width="match_parent" android:layout_height="wrap_content"/> <EditText android:id="@+id/userInputField" android:hint="请输入..." android:inputType="textPersonName" android:layout_width="match_parent" android:layout_height="wrap_content"/> <Button android:id="@+id/submitButton" android:text="提交" android:onClick="onSubmitClick" android:layout_marginTop="10dp" android:layout_width="wrap_content" android:layout_gravity="end" android:layout_height="wrap_content"/> </LinearLayout> ``` 2. 接着,在 Activity 或 Fragment 内部初始化该定制化视图对象并与之绑定事件监听器: ```java public void showCustomDialog() { LayoutInflater inflater = getLayoutInflater(); View dialogView = inflater.inflate(R.layout.custom_dialog, null); new AlertDialog.Builder(this) .setView(dialogView) .create() .show(); Button submitBtn = dialogView.findViewById(R.id.submitButton); EditText inputText = dialogView.findViewById(R.id.userInputField); submitBtn.setOnClickListener(v -> { String userInput = inputText.getText().toString(); Toast.makeText(getApplicationContext(), "您输入的是:" + userInput, Toast.LENGTH_SHORT).show(); }); } ``` 以上过程说明了怎样基于特定业务需求打造专属外观风格以及行为模式各异的各种类型的对话框[^4]。 #### 泛型参数化的高级应用案例 对于更加动态变化的数据源或者频繁复用相同结构却不同数据填充的情况,则可考虑引入泛型机制进一步优化封装程度: ```java public class GenericDialog<T> extends Dialog { private final T data; protected GenericDialog(@NonNull Context context, int themeResId, T inputData) { super(context, themeResId); this.data = inputData; } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.generic_dialog_layout); TextView contentTxt = findViewById(R.id.content_text_view); if(data instanceof String){ contentTxt.setText((String)data); }else{ contentTxt.setText(String.valueOf(data)); } } } ``` 调用方只需传入对应类型的实际值即可完成个性化展示效果设置[^5]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值