您的位置:首页 > 编程语言

打造一个属于自己的BaseActivity(沉浸状态栏,dialog,完全退出程序。应有尽有)

2017-01-12 11:27 423 查看
写这个之前,我先给我沉浸式状态栏的解决方案,我的BaseActivity就是基于这个的:

http://stormzhang.com/android/2015/08/16/boohee-toolbar/

话不多说,上代码

我想看了上面的解决方案应该就很简单就可以实现沉浸状态栏了,但是这里还是要贴出我的代码,因为有我自己的特色。

我这里用的是Toolbar来实现自己的头部,下面是头部布局:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/app_title"
android:minHeight="?attr/actionBarSize"
android:paddingTop="@dimen/toolbar_padding_top"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">

<TextView
android:id="@+id/tv_title"
android:layout_width="200dp"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:ellipsize="marquee"
android:focusable="true"
android:focusableInTouchMode="true"
android:gravity="center"
android:marqueeRepeatLimit="marquee_forever"
android:singleLine="true"
android:text="标 题"
android:textColor="#ffffff"
android:textSize="18sp" />

<ImageView
android:id="@+id/iv_right_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="right"
android:layout_marginRight="16dp"
android:visibility="gone" />

<TextView
android:id="@+id/tv_count_down"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="right"
android:layout_marginRight="16dp"
android:textColor="@color/colorWhite"
android:textSize="14sp"
android:visibility="gone" />
</android.support.v7.widget.Toolbar>


有人看到这个布局下面又是TextView又是ImageView的,就会疑惑,toobar不是可以直接设置标题跟图标么,为什么还要这些?

很简单,因为toobar的标题无法居中,所以我们还不如自己去设计一个,不是么?想放在那就放在那

之后就是设置toolbar_padding_top



dimens 下设置toolbar_padding_top values下设置为0dp,v19下设置为25dp。

下面就开始我的BaseActivity的编写了:

布局代码

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/root_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">

<include layout="@layout/toolbar_layout" />
</LinearLayout>


activity代码:

/**
* Created by 5u51_5 on 2016/8/22.
*/
public abstract class BaseActivity extends AppCompatActivity {
//一个专门用于装开启的Activity的集合,Activity栈
public static List<Activity> activities;
private LinearLayout rootLayout;
private ImageView ivRightIcon;
private TextView tvTitle;
private OnRightIconClick rightIconClick;
private Toolbar toolbar;
private OnLeftIconClick leftIconClick;
private OnRightTextClick rightTextClick;
private Dialog dialog;
private Dialog tipDialog;
private TextView tvCountDown;

public BaseActivity() {
//构造方法创建装Activity的list
if (activities == null) {
activities = new ArrayList<Activity>();
}
}

//重写onCreate
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 这句很关键,注意是调用父类的方法
super.setContentView(R.layout.activity_base);

// 经测试在代码里直接声明透明状态栏更有效(设置状态栏透明)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
WindowManager.LayoutParams localLayoutParams = getWindow().getAttributes();
localLayoutParams.flags = (WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS | localLayoutParams.flags);
}
activities.add(this);
}

@Override
public void setContentView(int layoutId) {
setContentView(View.inflate(this, layoutId, null));
}

/**
* 绑定view(用LinearLayout去add自己子activity的布局)
*
* @param view
*/
@Override
public void setContentView(View view) {
rootLayout = (LinearLayout) findViewById(R.id.root_layout);
if (rootLayout == null) return;
rootLayout.addView(view, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
initToolbar();
}

/**
* 初始化标题
* 由于toolbar的标题无法居中,而且有限制,所以设置标题为空字符串,自己配置标题样式
*/
private void initToolbar() {
toolbar = (Toolbar) findViewById(R.id.toolbar);
toolbar.setTitle("");
if (toolbar != null) {
setSupportActionBar(toolbar);
}
}

/**
* 设置自己的标题
*
* @param title
*/
public void setTitle(String title) {
tvTitle = (TextView) findViewById(R.id.tv_title);
tvTitle.setText(title);
}

/**
* 设置头部颜色
*
* @param color
*/
public void setHeadColor(int color) {
toolbar.setBackgroundColor(color);
}

/**
* 左侧图标
*
* @param resId
*/
public void setLeftIcon(int resId) {
toolbar.setNavigationIcon(resId);
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (leftIconClick != null) {
leftIconClick.leftIconClick(view);
}
}
});
}

/**
* 右侧图标
*
* @param resId
*/
public void setRightIcon(int resId) {
ivRightIcon = (ImageView) findViewById(R.id.iv_right_icon);
ivRightIcon.setVisibility(View.VISIBLE);
ivRightIcon.setImageResource(resId);
ivRightIcon.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (rightIconClick != null) {
rightIconClick.rightIconClick(view);
}
}
});
}

/**
* 右侧文字
*
* @param text
*/
public void setRightText(String text) {
tvCountDown = (TextView) findViewById(R.id.tv_count_down);
tvCountDown.setVisibility(View.VISIBLE);
tvCountDown.setText(text);
tvCountDown.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (rightTextClick != null) {
rightTextClick.rightTextClick(view);
}
}
});
}

/**
* 右侧文字显隐状态
*
* @param gone
*/
public void setRightTextGone(boolean gone) {
if (gone) {
tvCountDown.setVisibility(View.GONE);
} else {
tvCountDown.setVisibility(View.VISIBLE);
}
}

/**
* 设置没有标题栏(全屏,状态栏透明)
*/
public void setToolbarGone() {
toolbar.setVisibility(View.GONE);
}

/**
* 右侧图标点击
*
* @param rightIconClick
*/
public void setOnRightIconClick(OnRightIconClick rightIconClick) {
this.rightIconClick = rightIconClick;
}

public interface OnRightIconClick {
void rightIconClick(View view);
}

/**
* 右侧文字点击
*
* @param rightTextClick
*/
public void setOnRightTextClick(OnRightTextClick rightTextClick) {
this.rightTextClick = rightTextClick;
}

public interface OnRightTextClick {
void rightTextClick(View view);
}

public interface OnLeftIconClick {
void leftIconClick(View view);
}

/**
* 左侧图标点击
*
* @param leftIconClick
*/
public void setOnLeftIconClick(OnLeftIconClick leftIconClick) {
this.leftIconClick = leftIconClick;
}

//重写onDestory
@Override
protected void onDestroy() {
activities.remove(this);
Log.i("移出一个Activity", this.toString() + "个数:" + activities.size());
super.onDestroy();

}

/**
* 退出程序
*/
public void finishAll() {
for (Activity activity : activities) {
activity.finish();
}
}

/**
* 加载dialog (看需求配置)
*
* @param context
* @param msg
*/
public void showLoadingDialog(Context context, String msg) {
if (context != null) {
dialog = new Dialog(context, R.style.dialog);
View dialogView = LayoutInflater.from(context).inflate(R.layout.view_loading, null);
TextView tvMsg = (TextView) dialogView.findViewById(R.id.tv_msg);
tvMsg.setText(msg);
dialog.setContentView(dialogView);
Window dialogWindow = dialog.getWindow();
dialogWindow.setGravity(Gravity.CENTER);
dialogWindow.setLayout(SizeUtils.dp2px(context, 260), LinearLayout.LayoutParams.WRAP_CONTENT);
dialog.setCanceledOnTouchOutside(false);
dialog.setCancelable(false);
dialog.show();
}
}

public void closeLoadingDialog() {
if (dialog.isShowing()) {
dialog.dismiss();
}
}

public TextView getRightView() {
if (tvCountDown == null) {
tvCountDown = (TextView) findViewById(R.id.tv_count_down);
}
return tvCountDown;
}

public void closeTipDialog() {
if (tipDialog.isShowing()) {
tipDialog.dismiss();
}
}

/**
* 提示弹窗
*
* @param context
* @param msg
* @param sureText
* @param cancelText
* @param sureClickListener
* @param cancleClickListener
*/
public void showTipDialog(Context context, String msg, String sureText,
final String cancelText, final OnSureClickListener sureClickListener, final OnCancleClickListener cancleClickListener) {
tipDialog = new Dialog(context, R.style.dialog);
View dialogView = LayoutInflater.from(context).inflate(R.layout.view_tip_dialog, null);
TextView tvMsg = (TextView) dialogView.findViewById(R.id.tv_msg);
TextView tvSure = (TextView) dialogView.findViewById(R.id.tv_sure);
TextView tvCancel = (TextView) dialogView.findViewById(R.id.tv_cancel);
tvMsg.setText(msg);
tvSure.setText(sureText);
tvCancel.setText(cancelText);
tvSure.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
closeTipDialog();
if (sureClickListener != null) {
sureClickListener.sureClick(view);
}

}
});
tvCancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
closeTipDialog();
if (cancleClickListener != null) {
cancleClickListener.cancleClick(view);
}

}
});

tipDialog.setContentView(dialogView);
Window dialogWindow = tipDialog.getWindow();
dialogWindow.setGravity(Gravity.CENTER);
dialogWindow.setLayout(SizeUtils.dp2px(getApplication(), 260), LinearLayout.LayoutParams.WRAP_CONTENT);
tipDialog.show();
}

/**
* 界面跳转
*
* @param activity 传入Activity.class
*/
public void moveToActivity(Class activity) {
Intent intent = new Intent(this, activity);
startActivity(intent);
}

public interface OnSureClickListener {
void sureClick(View view);
}

public interface OnCancleClickListener {
void cancleClick(View view);
}

}


这里,虽然我的BaseActivity 的封装已经结束了,但是里面还可以添加不少东西。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  代码封装