Android 사용자 정의 ActionProvider Toolbar Menu 레 드 포인트 구현

오늘 의 몇 가지 목표:
1.사용자 정의 ActionProvider
2.도구 모음 ActionBar 사용자 정의 메뉴
3.도구 모음 ActionBar 오른쪽 메뉴 에 커서 추가(도구 모음 ActionBar 메뉴 에 빨 간 점 추가)
원본 코드 는 문장의 끝 에 있다.
--------------------------------------------------------------------------------
효과 미리 보기
사용자 정의 Menu 이후 네 이 티 브 MD 의 어떠한 효과 에 도 영향 을 주지 않 습 니 다.외부 에서 표 시 된 텍스트 와 색상 등 속성 을 제어 할 수 있 습 니 다.

수요 설명 및 분석
일반적으로 우 리 는 Titlebar 를 사용자 정의 하여 많은 사용자 정의 효 과 를 실현 할 수 있 습 니 다.그런데 나중에 Toolbar 가 나 와 서 너무 좋 았 습 니 다.그래서 우 리 는 모두 Toolbar 를 사 용 했 습 니 다.그런데 우 리 는 오른쪽 에 있 는 Menu Button 에 BadgeView 와 같은 효 과 를 실현 하려 고 합 니 다.(위 그림 의 빨 간 점)어떻게 해 야 합 니까?
이 요 구 를 보고 Action Provider 를 해 본 적 이 없 는 친구 들 은 당황 할 수 있 습 니 다.하지만 저 와 함께 이 Menu 의 구성 을 분석 해 보 세 요.하나의 ImageView 는 icon 을 표시 하고 하나의 TextView 는 숫자 를 표시 하 며 TextView 는 동 그 란 배경 이 있 습 니 다.(모든 모양 이나 색 일 수 있 습 니 다)그러면 시스템 의 menu.xml 로 할 수 없 기 때문에 Menu 를 사용자 정의 해 야 합 니 다.사용자 정의 View 를 생각 했 을 수도 있 지만 필요 하지 않 습 니 다.
우 리 는 보통 menu 를 쓸 때 menu.xml 에서 대략 다음 과 같다.

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:app="http://schemas.android.com/apk/res-auto">
  <item
    android:id="@+id/menu_pic"
    android:title="      "
    app:showAsAction="always" />
</menu>

사실 이 menu 의 item 은 android:actionProvider Class 속성 이 있 습 니 다.이 속성 으로 여기에 표 시 된 내용(View)을 사용자 정의 할 수 있 습 니 다.이 속성의 값 은 완전한 클래스 입 니 다.예 를 들 어 com.yanzhenjie.XXOOprovider 와 같은 것 입 니 다.이 XXOOprovider 는 Action Provider 를 계승 해 야 합 니 다.구체 적 인 작업 도 모두 Action Provider 에서 이 루어 집 니 다.
우선 ActionProvider 계승
여기 서 특별한 설명 을 해 야 합 니 다.Toolbar 는 슈퍼 port 패키지 에 있 기 때문에 슈퍼 port 에 있 는 Action Provider 류 를 사용 해 야 합 니 다.이 종 류 는 슈퍼 port.v4 에 있 습 니 다.Toolbar 와 Action Bar 를 호 환 하기 때문에 저 희 는 이 Action Provider 류 를 사용자 정의 한 후에 Toolbar 와 Action Bar 에서 마음대로 사용 할 수 있 습 니 다.
우 리 는 각 표를 실현 해 야 하기 때문에 이 종 류 를 BadgeAction Provider 라 고 부 릅 니 다.Action Provider 를 계승 하려 면 onCreate Action View()방법 이 필요 합 니 다.

public class BadgeActionProvider extends ActionProvider {
  public BadgeActionProvider(Context context) {
    super(context);
  }

  @Override
  public View onCreateActionView() {
    return view;
  }
}

사용자 정의 레이아웃:표시 할 BadgeView
우 리 는 onCreate ActionView()클래스 를 보 려 면 return 하나의 View 가 필요 합 니 다.이 View 는 바로 우리 가 사용자 정의 View 입 니 다.그래서 우 리 는 이어서 표 시 된 View 를 정의 합 니 다.간단 한 것 은 글 에서 분석 한 ImageView 와 TextView 입 니 다.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="wrap_content"
  android:layout_height="match_parent"
  android:background="?actionBarItemBackground">

  <ImageView
    android:id="@+id/iv_icon"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:layout_centerInParent="true"
    android:scaleType="center" />

  <TextView
    android:id="@+id/tv_badge"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentEnd="true"
    android:layout_alignParentRight="true"
    android:layout_margin="2dp"
    android:background="@drawable/circle_red"
    android:gravity="center"
    android:text="0"
    android:textColor="@android:color/white"
    android:textSize="12sp" />

</RelativeLayout>

위 코드 에서 설명 할 것 은 android:background=?actionBarItemBackground 는 시스템 의 기본 Toolbar/ActionBar 의 Menu 를 참조 하 는 클릭 효과 입 니 다.TextView 의 android:background="@drawable/circle레 드 가 바로 그 둥 근 빨간색 배경 이에 요.
Action Provider 와 사용자 정의 레이아웃 의 결합
위 에서 계승 도 끝 났 고 사용자 정의 레이아웃 도 작성 되 었 습 니 다.다음은 두 사람의 결합 입 니 다.

public class BadgeActionProvider extends ActionProvider {

  private ImageView mIvIcon;
  private TextView mTvBadge;

  //        View   ,         Listener    menu   。
  private int clickWhat;
  private OnClickListener onClickListener;

  public BadgeActionProvider(Context context) {
    super(context);
  }

  @Override
  public View onCreateActionView() {
    int size = getContext().getResources().getDimensionPixelSize(
    android.support.design.R.dimen.abc_action_bar_default_height_material);

    ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams(size, size);
    View view = LayoutInflater.from(getContext())
    .inflate(R.layout.menu_badge_provider, null, false);

    view.setLayoutParams(layoutParams);
    mIvIcon = (ImageView) view.findViewById(R.id.iv_icon);
    mTvBadge = (TextView) view.findViewById(R.id.tv_badge);
    view.setOnClickListener(onViewClickListener);
    return view;
  }

  //     。
  private View.OnClickListener onViewClickListener = new View.OnClickListener() {
    @Override
    public void onClick(View v) {
      if (onClickListener != null)
        onClickListener.onClick(clickWhat);
    }
  };

  //       。
  public void setOnClickListener(int what, OnClickListener onClickListener) {
    this.clickWhat = what;
    this.onClickListener = onClickListener;
  }

  public interface OnClickListener {
    void onClick(int what);
  }
}

위의 코드 가 유일 하 게 의 심 스 러 운 점:
int size = getContext().getResources().getDimensionPixelSize(
        android.support.design.R.dimen.abc_action_bar_default_height_material);
이 문 구 는 슈퍼 port 에서 Toolbar/ActionBar 의 높이 를 읽 고 이 Menu 의 높이 와 너비 가 시스템 의 menu 와 일치 하도록 하 는 것 입 니 다.
자,여기까지 Action Provider 의 사용자 정의 가 거의 끝 났 습 니 다.사용자 정의 방법 을 추가 하 는 것 이 가장 많 습 니 다.

//     。
public void setIcon(@DrawableRes int icon) {
  mIvIcon.setImageResource(icon);
}

//        。
public void setBadge(int i) {
  mTvBadge.setText(Integer.toString(i));
}

//     。
public void setTextInt(@StringRes int i) {
  mTvBadge.setText(i);
}

//        。
public void setText(CharSequence i) {
  mTvBadge.setText(i);
}

사용자 정의 ActionProvider 를 사용 하 는 방법
이제 글 의 시작 으로 돌아 가 야 합 니 다.안 드 로 이 드:actionProvider Class 속성 에 완전한 사용자 정의 Action Provider 클래스 이름 을 입력 하 십시오.전에 말 했 듯 이 여 기 는 support 클래스 이기 때문에 약간 변경 해 야 합 니 다.

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:app="http://schemas.android.com/apk/res-auto">
  <item
    android:id="@+id/menu_pic"
    android:title="      "
    app:actionProviderClass="com.yanzhenjie.BadgeActionProvider"
    app:showAsAction="always" />
</menu>

여기 가 app:actionProvider Class 로 변 한 것 은 xml 의 머리 에 xmlnamespace 가 도입 되 었 기 때 문 입 니 다.
자바 코드 제어 사용자 정의 Menu
위의 menu.xml 준비 작업 이 모두 끝 났 습 니 다.다음은 자바 코드 로 이 xml 를 우리 의 Activity 나 Fragment 에 불 러 옵 니 다.여기 서 우 리 는 Activity 를 예 로 들 어 AppCompat Activity 를 계승 합 니 다.
우선 menu 를 불 러 올 때 사용자 정의 Action Provider 를 기록 합 니 다.

private BadgeActionProvider mActionProvider;

@Override
public boolean onCreateOptionsMenu(Menu menu) {
  getMenuInflater().inflate(R.menu.menu_main, menu);

  MenuItem menuItem = menu.findItem(R.id.menu_delete);
  mActionProvider = (BadgeActionProvider) MenuItemCompat.getActionProvider(menuItem);
  mActionProvider.setOnClickListener(0, onClickListener);//       。
  return true;
}

특히 주의:많은 학생 들 이 여기 서 setOnClickListener 에 빈 포인터 이상 이 발생 했 습 니 다.이 유 는 app:actionProvider Class="com.yanzhenjie.BadgeAction Provider"라 는 코드 에서 인용 한 사용자 정의 클래스 이름 오류 입 니 다.가방 이름 으로 작성 하고 블 로그 에 있 는 것 을 복사 하지 마 십시오.
여기 클릭 감청 설정 은 앞에서 도 강조 하 였 습 니 다.여기 구덩이 가 있 습 니 다.우 리 는 방금 icon 과 text 를 설정 하 는 몇 가지 방법 을 제공 하지 않 았 습 니까?onCreate Options Menu()에서 직접 호출 할 수 없습니다.Action Provider 가 아직 불 러 오지 않 았 기 때문에 초기 화 설정 icon 과 text 를 동적 으로 초기 화 하려 면 onWindow FocusChanged()에서 해 야 합 니 다.

@Override
public void onWindowFocusChanged(boolean hasFocus) {
  super.onWindowFocusChanged(hasFocus);
  mActionProvider.setIcon(R.mipmap.ic_action_delete_small);
  mActionProvider.setIcon(R.mipmap.ic_action_picture);
}

여기 서도 설명 하 자 면 onCreate Options Menu()에서 직접 초기 화 할 수 없 으 며,onCreate Options Menu()방법 이 실행 되면 마음대로 호출 할 수 있 습 니 다.
그래서 이 제 는 표 시 된 텍스트 와 아이콘 을 마음대로 설정 할 수 있 습 니 다.그러면 우리 글 에서 처음에 언급 한 몇 가지 목표 도 모두 완성 되 었 습 니 다.
원본 다운로드:http://xiazai.jb51.net/201609/yuanma/AndroidActionProvider(jb51.net).rar
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기