AndroidカスタムアクションProvider ToolBar Menu紅点を実現


今日のいくつかの目標:
1.カスタムアクションプロバイダー
2.Toolbar ActiverカスタムMenu
3.Toolbar Action Bar右側Menu追加角標(Toolbar Activer Menu追加小紅点)
ソースコードは文章の最後にあります。
--------------------------------------------------
効果のプレビュー
Menuをカスタマイズしても、元MDの効果には影響しません。表示するテキストや色などの属性は外部から制御できます。

需要の説明と分析
通常はTitlebarをカスタマイズして、多くのカスタム効果を実現できます。でも、Toolbarが出てきてとても使いやすいです。だから、私達は全部Toolbarを使いました。でも右側のMenu ButtonにBadgeViewのような効果を実現したいです。どうすればいいですか?
この要求を見てからActProviderを遊んだことがない学生は慌ててしまうかもしれませんが、先に私にこのMenuの構成を分析してください。ImageViewはiconを表示しています。TextViewは数字を表示しています。TextViewは丸い背景があります。システムのmenu.xmlは使えなくなりますので、Menuをカスタマイズします。カスタムViewを思い付いた人もいます。butは必要ありません。
私たちは通常、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属性があります。この属性でここに表示された内容をカスタマイズできます。この属性の値はcomp.yanzhenjie.XOOProviderのような完全な類名です。このXOOProviderはActoviderを継承しなければなりません。
まずはアクションプロバイダーを継承します。
ここに座って特殊な説明をします。Toolbarはsupportで包装したので、supportの下のActProvider類を使いたいです。このクラスはsupport.v 4の下で、ToolbarとActiverの互換性があります。このActProvider類をカスタマイズしたらToolbarとActBarの中で自由に使えます。
角標を実現するためには、とりあえずこの類をBadgeAction Providerといいます。アクションプロバイダーを継承するには、onCreateAction Viewを実現する必要があります。

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

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

カスタムレイアウト:表示するBadgeView
私たちはonCreateAction View()類を見ると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="だけですか?actionBarItem Backgroundは、Trolbar/ActiverのMenuを引用するクリック効果です。TextViewのandroid:background=「@drawable/circule_」red「あの丸い赤い背景です。
アクションプロバイダーとカスタムレイアウトの組み合わせ
上の継承も終わりました。カスタムレイアウトも書きました。続いて両者の結合です。

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=get Conttext().getsResource().get DimensionPixelSize(
        android.support.design.R.dimen.abc_action_bar_default_ヘightmaterial
この文はsupport下のToolbar/Activerの高さを読み取って、このMenuの高さと幅をシステムのmenuと一致させるためです。
はい、ここではアクションプロバイダーのカスタマイズが基本的に終わります。最大でカスタムの方法を追加します。

//     。
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);
}

カスタムアクションプロバイダーの使い方
今は文章の冒頭に戻ります。Android:actionProvider Class属性に完全なカスタムアクションプロバイダークラス名を記入します。前にここはsupprtのクラスだと言っていましたが、ここはちょっと変えます。

<?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を導入したからです。
Javaコード制御カスタムMenu
上のmenu.xmlの準備は全部終わりました。これからはjavaコードでActivityまたはFragmentにこのxmlをロードします。ここではActivityを例にして、AppCompantActivityを引き継ぎます。
まずmenuをロードする時に、私達が先ほどカスタムしたアクションプロバイダーを記録します。

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;
}

特に注意してください。多くの学生がここでset OnClickListenerに空の指針の異常が発生しました。原因はap:actionProvider Class=「comp.yanzhenjie.BadgeAction Provider」というコードから引用されたカスタムクラス名のエラーです。あなたのカバン名を記入して、ブログの中のコピーをしないでください。
ここでクリックして傍受することを設定します。上記でも強調しました。ここにはいくつかの方法があります。iconとtextを設定したのではないですか?onCreateOptionsMenu()で直接に呼出してはいけません。アクションプロバイダーはまだ初期化が完了していませんので、動的初期化設定iconとtextはonwindowFocus Chend(中)でお願いします。

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

ここでも説明したいのですが、OcreateOptionsMenu()は直接初期化できません。OptionsMenu()メソッドの実行が終わったら、任意に呼び出すことができます。
表示されている文字やアイコンを自由に設定することができます。文章の書き出しのいくつかの目標もすべて完了しました。
ソースのダウンロード:http://xiazai.jb51.net/201609/yuanma/AndroidActionProvider(jb 51.net)rar
以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。