AndroidカスタムアクションProvider ToolBar Menu紅点を実現
8460 ワード
今日のいくつかの目標:
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の中で大体次のように書きます。
まずはアクションプロバイダーを継承します。
ここに座って特殊な説明をします。Toolbarはsupportで包装したので、supportの下のActProvider類を使いたいです。このクラスはsupport.v 4の下で、ToolbarとActiverの互換性があります。このActProvider類をカスタマイズしたらToolbarとActBarの中で自由に使えます。
角標を実現するためには、とりあえずこの類をBadgeAction Providerといいます。アクションプロバイダーを継承するには、onCreateAction Viewを実現する必要があります。
私たちはonCreateAction View()類を見るとreturn一つのViewが必要です。このViewは私達がカスタマイズしたViewです。だから私達は次に表示のViewを定義します。簡単なのは文章の冒頭で分析したImageViewとTextViewです。
アクションプロバイダーとカスタムレイアウトの組み合わせ
上の継承も終わりました。カスタムレイアウトも書きました。続いて両者の結合です。
int size=get Conttext().getsResource().get DimensionPixelSize(
android.support.design.R.dimen.abc_action_bar_default_ヘightmaterial
この文はsupport下のToolbar/Activerの高さを読み取って、このMenuの高さと幅をシステムのmenuと一致させるためです。
はい、ここではアクションプロバイダーのカスタマイズが基本的に終わります。最大でカスタムの方法を追加します。
今は文章の冒頭に戻ります。Android:actionProvider Class属性に完全なカスタムアクションプロバイダークラス名を記入します。前にここはsupprtのクラスだと言っていましたが、ここはちょっと変えます。
Javaコード制御カスタムMenu
上のmenu.xmlの準備は全部終わりました。これからはjavaコードでActivityまたはFragmentにこのxmlをロードします。ここではActivityを例にして、AppCompantActivityを引き継ぎます。
まずmenuをロードする時に、私達が先ほどカスタムしたアクションプロバイダーを記録します。
ここでクリックして傍受することを設定します。上記でも強調しました。ここにはいくつかの方法があります。iconとtextを設定したのではないですか?onCreateOptionsMenu()で直接に呼出してはいけません。アクションプロバイダーはまだ初期化が完了していませんので、動的初期化設定iconとtextはonwindowFocus Chend(中)でお願いします。
表示されている文字やアイコンを自由に設定することができます。文章の書き出しのいくつかの目標もすべて完了しました。
ソースのダウンロード:http://xiazai.jb51.net/201609/yuanma/AndroidActionProvider(jb 51.net)rar
以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。
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
以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。