Android 사용자 정의 ActionProvider Toolbar Menu 레 드 포인트 구현
9505 단어 AndroidActionProviderToolBarMenu
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
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Bitrise에서 배포 어플리케이션 설정 테스트하기이 글은 Bitrise 광고 달력의 23일째 글입니다. 자체 또는 당사 등에서 Bitrise 구축 서비스를 사용합니다. 그나저나 며칠 전 Bitrise User Group Meetup #3에서 아래 슬라이드를 발표했...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.