To jest trochę późno, ale mam nadzieję, że ktoś pomaga.
Próbowałem zrobić to, co robiłeś z PopupMenu
, ale nic nie działało dla mnie, dopóki nie dowiedziałem się o ListPopupWindow
. To lepsza alternatywa. O wiele bardziej elastyczna według mnie i możesz osiągnąć odstępy między marginesem, o które pytałeś.
Oto kod:
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();
}
});
}
}
Kluczowym elementem jest powołanie mPopupWindow.setHorizontalOffset()
. Należy pamiętać, że ta metoda jest trudna. W zależności od wartości ustawionej w mPopupWindow.setWidth()
należy odpowiednio dostosować wartość w setHorizontalOffset()
. Tak się złożyło, że dla mojej aplikacji, -380
była idealną ilością marginesu potrzebną od końca. Być może będziesz musiał grać z tą wartością.
Sądzę, że to samo można powiedzieć o używaniu setHeight()
i setVerticalOffset()
, jeśli chcesz mieć margines u góry okna podręcznego.
Nadzieja to pomaga:]
Zasadniczo, to nie jest trzymanie się prawa do ekranu, ale przykleja się do kotwicy View można ustawić w Konstruktora jako kotwicy. Nie wiem, jak Youtube przedstawia PopupMenus, ale możesz spróbować użyć innej kotwicy, i.E. ustawianie niewidzialnego widoku tylko w celu dołączenia do niego PopupMenu. –
Próbowałem tego samego. ale wciąż trzyma się prawej strony. Próbowałem stworzyć fałszywy widok zakotwiczenia, ale mimo to zachowanie jest takie samo. –
Och, masz rację, właśnie to potwierdziłem. Nie jestem pewien, czy tak robi YouTube, ale proponuję użyć 'PopupWindow' zamiast' PopupMenu'. "PopupWindow" jest bardziej ładnie zakotwiczony w widoku, ale musisz go sam ułożyć –