美文网首页
自定义标题

自定义标题

作者: zhengLH | 来源:发表于2019-01-04 14:50 被阅读0次

【需求】app项目中由于使用了全屏沉浸式,造成整个布局上移,所以自定了标题,将标题向下移。

/**
 * @Author Lee
 * @Time 2018/9/14
 * @Theme
 */

public class CustomTilte extends RelativeLayout {

private int statusBarHeight;
private OnBackClickListener mListener;
private String title;
private String mTitle;
private TextView mTvTitle;
private boolean isBackDismiss;
private ImageView mIVBack;

public CustomTilte(Context context) {
    this(context , null);
}

public CustomTilte(Context context, AttributeSet attrs) {
    super(context, attrs);
    init(context, attrs ,0);
}


public CustomTilte(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    init(context, attrs, defStyleAttr);
}


private void init(final  Context context, AttributeSet attrs, int defStyle) {

    TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.AppTilte, defStyle, 0);
    title = a.getString(R.styleable.AppTilte_title);
    isBackDismiss = a.getBoolean(R.styleable.AppTilte_isBackDismiss, false);
    a.recycle();

    Log.v("lee", "------------- 自定义标题 ----------------  " + title);

    View view = LayoutInflater.from(context).inflate(R.layout.include_title, this);

    mTvTitle = view.findViewById(R.id.tv_title);
    mIVBack = view.findViewById(R.id.iv_back);

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {

        statusBarHeight = MachineUtils.getStatusBarHeight(getContext());
        mTvTitle.setPadding(0, statusBarHeight + 10, 0, 0);
        mIVBack.setPadding(0,statusBarHeight + 10,0,0);
    }

    mTvTitle.setText(title);
    if(isBackDismiss){
        mIVBack.setVisibility(GONE);
    }else {

        mIVBack.setVisibility(VISIBLE);
        mIVBack.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {

                if(mListener != null){
                    mListener.onBack();
                }

            }
        });
    }


}

public void setTitle(String title){
    mTvTitle.setText(title);

}

public interface OnBackClickListener{

    void onBack();
}

public void setOnBackListener(OnBackClickListener mListener) {
    this.mListener = mListener;
  }
}

【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="wrap_content"
xmlns:tools="http://schemas.android.com/tools">

<RelativeLayout
    android:id="@+id/rl_title"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/tv_title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        tools:text="标题"
        android:layout_centerInParent="true"
        android:textColor="@color/shell_font_black"
        android:textStyle="bold"
        android:textSize="20sp"/>

    <ImageView
        android:id="@+id/iv_back"
        android:src="@drawable/vest_icon_back"
        android:layout_centerVertical="true"
        android:layout_marginLeft="8dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

  </RelativeLayout>
</LinearLayout>

【attrs.xml】

<declare-styleable name="AppTilte">
    <attr name="title" format="string" />  <!-- 标题 -->
    <attr name="isBackDismiss" format="boolean"/>  <!-- 返回键 是否可见-->
</declare-styleable>
图片.png

【工具类】

public class MachineUtils {

/**
 * 隐藏输入键盘的方法
 */
public static void hideInput(Activity activity) {
    if (activity == null) {
        return;
    }
    InputMethodManager imm = (InputMethodManager) activity
            .getSystemService(Context.INPUT_METHOD_SERVICE);
    if (imm != null) {
        imm.hideSoftInputFromWindow(activity.getWindow().getDecorView()
                .getWindowToken(), 0);
    }
}

/**
 * 显示输入键盘的方法
 */
public static void showInput(Context context, View view) {
    if (view != null) {
        view.requestFocus();
        InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.showSoftInput(view, 0);
    }
}

/**
 * 切换输入键盘的方法
 */
public static void toggleInput(Context context) {
    if (context == null) {
        return;
    }
    InputMethodManager imm = (InputMethodManager) context
            .getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.toggleSoftInput(InputMethodManager.SHOW_FORCED,
            InputMethodManager.HIDE_NOT_ALWAYS);
}

/**
 * 测量下方操作栏的高度
 * @param context
 * @return
 */
public static int getNavigationBarHeight(Context context) {
    if (!hasSoftKeys((WindowManager) context.getSystemService(Context.WINDOW_SERVICE))) {
        return 0;
    }
    Resources resources = context.getResources();
    int resourceId = resources.getIdentifier("navigation_bar_height", "dimen", "android");
    return resources.getDimensionPixelSize(resourceId);
}

/**
 * 测量状态栏的高度
 * @param context
 * @return
 */
public static  int getStatusBarHeight(Context context){
    if (context == null){
        return -1;
    }
    int statusBarHeight = -1;
    //获取status_bar_height资源的ID
    int resourceId =context.getResources().getIdentifier("status_bar_height", "dimen", "android");
    if (resourceId > 0) {
        //根据资源ID获取响应的尺寸值
        statusBarHeight = context. getResources().getDimensionPixelSize(resourceId);
    }
    return  statusBarHeight;
}



private static boolean hasSoftKeys(WindowManager windowManager) {
    Display d = windowManager.getDefaultDisplay();

    DisplayMetrics realDisplayMetrics = new DisplayMetrics();
    d.getRealMetrics(realDisplayMetrics);

    int realHeight = realDisplayMetrics.heightPixels;
    int realWidth = realDisplayMetrics.widthPixels;

    DisplayMetrics displayMetrics = new DisplayMetrics();
    d.getMetrics(displayMetrics);

    int displayHeight = displayMetrics.heightPixels;
    int displayWidth = displayMetrics.widthPixels;

    return (realWidth - displayWidth) > 0 || (realHeight - displayHeight) > 0;
    }
}

【使用】
(1)在布局中:

 <com.shuixin.mvpshell.widget.CustomTilte
    android:id="@+id/custom_title"
    AppTilte:title = "头条资讯"
    android:layout_width="match_parent"
    android:layout_height="@dimen/shell_actionbar_height"/>

(2)在代码中:

 CustomTitle  mCustomTilte = (CustomTilte) findViewById(R.id.custom_title);
 mCustomTilte.setOnBackListener(new CustomTilte.OnBackClickListener() {
        @Override
        public void onBack() {
            finish();
        }
    });

相关文章

  • Android Dialog自定义去除标题

    style 无标题,有标题栏 无标题,无标题栏 自定义Dialog Activity调用

  • 列表代码

    无序列表 有序列表 嵌套: 自定义列表 大标题 小标题 小标题 小标题 大标题 小标...

  • iOS 导航栏标题及背景颜色

    标题自定义样式: 导航栏底色:

  • 自定义Dialog

    自定义Dialog可以设置两个自定义布局 自定义标题布局setCustomTitle(),方法参数为View类对象...

  • 导航栏和状态栏

    标题/隐藏BottomBar navigationItem 返回样式:系统图标,文字自定义 返回样式:自定义图标和...

  • Android自定义标题栏

    Android自定义标题栏思路:1.在layout中添加标题栏的布局文件title(具体布局自己设置)2.自定义控...

  • 微信小程序中 canvas 层级过高问题

    问题 在微信小程序中设置自定义标题后,自定义标题并不能覆盖住canvas 原因: 小程序中 canvas、text...

  • 安卓View

    【Android 自定义 View 实战】之自定义项目通用的标题栏 CustomTitleBar 【Android...

  • Android 自定义组合控件

    自定义组合控件 第一步定义你要复用的布局 第二步定义自定义属性 比如标题文字、标题栏左边按钮图标等。 第三步自定义...

  • 自定义标题栏ActionBarTextView

    自定义控件 /** 标题栏, 可设置标题和左右图标*/ 引用库 import android.annotation...

网友评论

      本文标题:自定义标题

      本文链接:https://www.haomeiwen.com/subject/xenhrqtx.html