デフォルトのポップメニューを使用しており、同じ動作を期待しています。すべてが正常に動作しています。ポップアップメニューのレンダリングに関する私の懸念事項。ポップアップメニューが画面の右側に表示されます。
Android向けのYouTubeアプリで使用されている動作が必要です。
主に、ポップアップメニューに適切なマージンを提供できません。助けてください。重力をポップアップメニューに提供しようとしました。ただし、ポップアップメニューは画面の右側に固定されます。
PopupMenu popupMenu = new PopupMenu(mContext, anchor, Gravity.LEFT);
popupMenu.getMenuInflater().inflate(R.menu.menu_edit_accessory, popupMenu.getMenu());
次の属性を使用して、PopupMenuの位置を変更できます:gravity、dropDownHorizontalOffsetおよびdropDownVerticalOffset
最初に重力を重力に設定します。END
popup.setGravity(Gravity.END);
次に、スタイルを作成してドロップダウンオフセットを変更します
<style name="MyPopupMenu" parent="@style/Widget.AppCompat.PopupMenu">
<item name="Android:dropDownHorizontalOffset">-4dp</item>
<item name="Android:dropDownVerticalOffset">4dp</item>
</style>
アンカービューを重ねる場合は、
parent="@style/Widget.AppCompat.PopupMenu.Overflow"
最後にMyPopupMenuをテーマに適用します
<item name="popupMenuStyle">@style/MyPopupMenu</item>
これは少し遅れますが、これが誰かの役に立つことを願っています。
PopupMenu
を使ってあなたがやっていることをしようとしていましたが、ListPopupWindow
について知るまで、何もうまくいきませんでした。それはより良い代替手段です。私の意見でははるかに柔軟であり、あなたが求めていたマージン間隔を達成することができます。
これがコードです:
_public class MainActivity extends AppCompatActivity
{
private ImageButton mMoreOptionsButton;
private ArrayAdapter<String> mPopupAdapter;
private ArrayList<String> mOptionsArray =
new ArrayList<>(Arrays.asList("Option1", "Option2", "Option3"));
private ListPopupWindow mPopupWindow;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mMoreOptionsButton = (ImageButton) view.findViewById(R.id.more_options_button);
setupPopupWindow();
}
private void setupPopupWindow()
{
mPopupAdapter = new ArrayAdapter<>(MainActivity.this, Android.R.layout.simple_spinner_dropdown_item, mOptionsArray);
mPopupWindow = new ListPopupWindow(MainActivity.this);
mPopupWindow.setAdapter(mPopupAdapter);
mPopupWindow.setAnchorView(mMoreOptionsButton);
mPopupWindow.setWidth(500);
mPopupWindow.setHorizontalOffset(-380); //<--this provides the margin you need
//if you need a custom background color for the popup window, use this line:
mPopupWindow.setBackgroundDrawable(new ColorDrawable(ContextCompat.getColor(MainActivity.this, R.color.gray)));
mPopupWindow.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id)
{
//do something with item by referring to it using the "position" parameter
}
});
mMoreOptionsButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v)
{
mPopupWindow.show();
}
});
}
}
_
重要な部分はmPopupWindow.setHorizontalOffset()
を呼び出すことです。この方法には注意が必要です。 mPopupWindow.setWidth()
に設定した値に応じて、setHorizontalOffset()
の値を適宜調整する必要があります。たまたま私のアプリでは、_-380
_が最後から必要なマージンの完璧な量でした。したがって、この値を少し操作する必要があるかもしれません。
ポップアップウィンドウの上部にマージンが必要な場合は、setHeight()
およびsetVerticalOffset()
を使用しても同じことが言えると思います。
お役に立てれば :]
特定の場所にpopUpWindowを設定できます
popupWindow .showAtLocation(popupView, Gravity.CENTER, 0, 0);
public void showAtLocation(View parent, int gravity, int x, int y) {
showAtLocation(parent.getWindowToken(), gravity, x, y);
}
DropDownとして表示したい場合は、
public void showAsDropDown(View anchor, int xoff, int yoff) {
showAsDropDown(anchor, xoff, yoff, DEFAULT_ANCHORED_GRAVITY);
}
PopupWindowのドキュメントをご覧ください http://developer.Android.com/intl/es/reference/Android/widget/PopupWindow.html