Questo è un po 'tardi, ma spero che questo aiuta qualcuno.
Stavo provando a fare quello che stavi facendo con un PopupMenu
ma nulla funzionava per me fino a quando non ho saputo di ListPopupWindow
. È un'alternativa migliore. Molto più flessibile secondo me e tu puoi ottenere la distanza dal margine che stavi chiedendo.
Ecco il codice:
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();
}
});
}
}
La parte fondamentale sta chiamando mPopupWindow.setHorizontalOffset()
. Essere consapevoli del fatto che questo metodo è difficile. A seconda del valore impostato in mPopupWindow.setWidth()
, è necessario regolare il valore in setHorizontalOffset()
di conseguenza. È successo che per la mia app, -380
era la quantità di margine che avevo bisogno dalla fine. Quindi potresti dover giocare un po 'con questo valore.
Credo che lo stesso si possa dire per l'utilizzo di setHeight()
e setVerticalOffset()
se si desidera un margine nella parte superiore della finestra popup.
Spero che questo aiuti:]
fonte
2016-05-29 08:13:45
In sostanza, non è attaccare a destra sullo schermo, ma si attacca al ancoraggio View si imposta nel costruttore come ancoraggio. Non so come YouTube mostri PopupMenus, ma potresti provare a utilizzare un'ancora diversa, ad esempio. impostando una vista invisibile allo scopo di associare il PopupMenu ad esso. –
Ho provato lo stesso. ma ancora si attacca a destra. Ho provato a creare la vista di ancoraggio falso, ma il comportamento è lo stesso. –
Oh, hai ragione, ho appena confermato da solo. Non sono sicuro che sia così che lo fa YouTube, ma suggerirei di provare a usare 'PopupWindow' al posto di' PopupMenu'. Il 'PopupWindow' è ancorato più piacevolmente alla vista, ma devi metterlo da solo –