Gmailアプリのポップアップメニューと同じものを、右上のオーバーフローボタンに固定して実装するのが好きです。そのために私はAndroid Androidポップアップメニュー のグーグルチュートリアルと同じコードを使用しましたが、私にとってはその下ではなくアクションバーのエッジの上にポップメニューを表示します。 gmailオーバーフローのポップメニューで、アクションバーのエッジでポップメニューが表示されることに注意してください。
これは私がポップアップメニューに使用したxmlです:
<menu xmlns:Android="http://schemas.Android.com/apk/res/Android" >
<item
Android:id="@+id/item1"
Android:title="lablab"/>
<item
Android:id="@+id/item2"
Android:title="lablab"/>
</menu>
そして以下は私の活動です:
public void showFontSetting(View view) {
PopupMenu popup = new PopupMenu(this, view);
MenuInflater inflater = popup.getMenuInflater();
inflater.inflate(R.menu.menu, popup.getMenu());
popup.show();
popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
// TODO Auto-generated method stub
switch (item.getItemId()) {
case R.id.item1:
Toast.makeText(Index.this,
"You Clicked : " + item.getTitle(),
Toast.LENGTH_SHORT).show();
break;
case R.id.item2:
break;
}
return true;
}
});
}
次のコードをアクティビティに追加します。
PopupWindow popupwindow_obj; // create object
popupwindow_obj=popupDisplay(); // initialize in onCreate()
popupwindow_obj.showAsDropDown(clickbtn,-40, 18); // where u want show on view click event
public PopupWindow popupDisplay() { // disply designing your popoup window
final PopupWindow popupWindow = new PopupWindow(this); // inflet your layout or diynamic add view
View view;
LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = inflater.inflate(R.layout.mylayout, null);
Button item = (LinearLayout) view.findViewById(R.id.button1);
popupWindow.setFocusable(true);
popupWindow.setWidth(WindowManager.LayoutParams.WRAP_CONTENT);
popupWindow.setHeight(WindowManager.LayoutParams.WRAP_CONTENT);
popupWindow.setContentView(view);
return popupWindow;
}
res/layout
ディレクトリにXMLを作成し、mylayout.xml
という名前を付けます
<LinearLayout
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:orientation="horizontal" >
<Button
Android:id="@+id/button1"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:text="Window test" />
</LinearLayout>
PopupMenu popupMenu = new PopupMenu(getContext(), this, Gravity.NO_GRAVITY, R.attr.actionOverflowMenuStyle, 0);
styles.xml
<style name="PopupMenuOverlapAnchor" parent="@style/Theme.AppCompat.Light">
<item name="Android:overlapAnchor">true</item>
<item name="Android:dropDownVerticalOffset">0dp</item>
<item name="Android:dropDownHorizontalOffset">0dp</item>
</style>
コード:
ContextThemeWrapper contextThemeWrapper = new ContextThemeWrapper(getContext(), R.style.PopupMenuOverlapAnchor);
PopupMenu popupMenu = new PopupMenu(contextThemeWrapper, this);
もう動作しません: ここでは、PopupMenu
の位置を調整する簡単な方法を示します。アクションバーのメニューのように、アンカービュー(overflowButton
)の上にメニューを配置します。
PopupMenu popupMenu = new PopupMenu(context, overflowMenuButton); popupMenu.inflate(R.menu.my_menu); // Fix vertical offset overflowMenuButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { popupMenu.show(); if (popupMenu.getDragToOpenListener() instanceof ListPopupWindow.ForwardingListener) { ListPopupWindow.ForwardingListener listener = (ListPopupWindow.ForwardingListener) popupMenu.getDragToOpenListener(); listener.getPopup().setVerticalOffset(-overflowMenuButton.getHeight()); listener.getPopup().show(); } } });
私の場合、重力を適用することが役に立ちました
PopupMenu popup = new PopupMenu(this, v, Gravity.RIGHT);
私が見つけた各アプローチを試した後、特により柔軟なレイアウトを使用している場合は、アンカービューを配置する方が簡単で簡単な方法であると思います。 ConstraintLayout。
ポップアップメニューを固定する場所に非表示のビューを配置するだけです。
<View
Android:id="@+id/anchor_menu"
Android:layout_width="0dp"
Android:layout_height="0dp"
Android:layout_marginTop="10dp"
app:layout_constraintStart_toStartOf="@+id/button_menu"
app:layout_constraintTop_toBottomOf="@+id/button_menu"
/>
次に、代わりにアンカービューとして使用します。
mPopupMenu = new PopupMenu(getActivity(), mPopupMenuAnchor);
ブーム、それは行われます。
popupwindow.showAsDropDown(view,x,y);
ここでxおよびyはポップアップウィンドウの位置ですビューに対する。