ボタンをクリックするとpopupmenu
が発生するAndroidアプリを作成しようとしています。 popupmenu
が生成されていますが、正しい位置にありません。コードは次のとおりです。
menu.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:Android="http://schemas.Android.com/apk/res/Android">
<group Android:checkableBehavior="single">
<item
Android:id="@+id/genderMale"
Android:title="Male"
/>
<item
Android:id="@+id/genderFemale"
Android:title="Female"
/>
</group>
</menu>
ポップアップを実行する関数は次のとおりです。
public void showGenderPopup(View v)
{
PopupMenu popup = new PopupMenu(this, v);
MenuInflater inflater = popup.getMenuInflater();
inflater.inflate(R.menu.gender_popup, popup.getMenu());
popup.show();
}
ここをクリックすると、popupmenu
がtextview
のすぐ下に作成されます。画面中央に生成させたい。
それについてどうやって行くのですか?
ドキュメントから言うように:
PopupMenuは、ビューにアンカーされたモーダルポップアップウィンドウにメニューを表示します。スペースがある場合はポップアップがアンカービューの下に表示され、スペースがない場合はその上にポップアップが表示されます。 IMEが表示されている場合は、タッチするまでポップアップは重なりません。ポップアップの外側をタッチすると、ポップアップが閉じます。
私が推測しているように、その「ビューv」
public void showGenderPopup(View v)
クリックしているTextViewです。クリックするとメソッドにバインドされます。つまり、PopupMenuはTextViewのすぐ下に表示されます。
ダイアログで目標を達成しませんか?カスタムAlertDialogの場合は、メソッドを使用するだけです
setView(View v)
ダイアログ自体を作成する前のAlertDialog.Builderの.
カスタムビューの場合は、次の2つの方法があります。
XML:XMLレイアウトファイルを作成し、インフレーターを使用してXMLレイアウトをビューのcustomViewオブジェクトに適用します。 (レイアウトファイルは、例としてcustomDialog.xmlと呼ばれます)
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View customView = inflater.inflate(R.layout.customDialog, null);
RadioButton radioButton = (RadioButton) customView.findViewById(R.id.customDialogRadioButton);
radioButton.setOnClickListener(new OnClickListener() { .. });
動的に:
例としてLinearLayoutを使用します。
LinearLayout customView = new LinearLayout(context);
RadioButton radioBtn = new RadioButton(context);
radioBtn.setOnClickListener(new OnClickListener() { .. });
customView.addView(radioBtn);
ダイアログを作成するには、このコードを使用します
AlertDialog.Builder b = new AlertDialog.Builder(context);
b.setMessage("Example");
// set dialog's parameters from the builder
b.setView(customView);
Dialog d = b.create();
d.show();
PopupMenu popup = new PopupMenu(this, v,Gravity.CENTER);
上記のコードを使用してください。重力には、中央/左/右のような多くのオプションがあります。