avuto qualche difficoltà a attuare le soluzioni proposte da StrikeForceZero e Luca Sleeman, così ho voluto contribuire la mia esperienza. Sono sicuro che c'è qualcosa che mi manca, quindi il feedback sarebbe molto apprezzato.
Quello che ho fatto è stato il seguente:
creare uno stile utilizzando l'apposita PopupTheme, copia diretta/incolla:
<style name="PopupTheme" parent="android:Theme.Holo.Light.Dialog">
<item name="android:windowIsFloating">false</item>
<item name="android:windowContentOverlay">@null</item>
<item name="android:windowSoftInputMode">stateAlwaysHidden</item>
<item name="android:windowActionModeOverlay">true</item>
<item name="android:windowIsTranslucent">true</item>
</style>
aggiungere il metodo showAsPopup() come metodo nella frammento che aprirebbe il finto frammento di dialogo, copia/incolla diretta:
private void showAsPopup(Activity activity) {
//To show activity as dialog and dim the background, you need to declare android:theme="@style/PopupTheme" on for the chosen activity on the manifest
activity.requestWindowFeature(Window.FEATURE_ACTION_BAR);
activity.getWindow().setFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND,
WindowManager.LayoutParams.FLAG_DIM_BEHIND);
LayoutParams params = activity.getWindow().getAttributes();
params.alpha = 1.0f;
params.dimAmount = 0f;
activity.getWindow().setAttributes((android.view.WindowManager.LayoutParams) params);
// This sets the window size, while working around the IllegalStateException thrown by ActionBarView
activity.getWindow().setLayout(850,850);
}
Creare un'istanza della nuova attività con una nuova chiamata semplice(), e poi passarlo al showAsPopup() Metodo:
DialogTestActivity test = new DialogTestActivity();
showAsPopup(test);
Ai fini del test (Stavo solo cercando di confermare che ho potrebbe aprire un'attività che viene presentata come una finestra di dialogo con una barra delle azioni) Ho usato un test estremamente semplice, rubato direttamente dal pulsante view api demo (per il file di layout, vedere buttons_1.xml nelle demo api):
public class DialogTestActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.buttons_test);
}
}
Sfortunatamente, ogni volta che ho provato questo, ottengo un unspecifi ed eccezione del puntatore null alla prima chiamata, activity.requestWindowFeature (Window.FEATURE_ACTION_BAR);
04-29 16:39:05.361: W/System.err(15134): java.lang.NullPointerException
04-29 16:39:05.361: W/System.err(15134): at android.app.Activity.requestWindowFeature(Activity.java:3244)
04-29 16:39:05.371: W/System.err(15134): at packagenameremovedforlegalreasons.classname.showAsPopup(classname.java:602)
04-29 16:39:05.371: W/System.err(15134): at packagenameremovedforlegalreasons.classname.onMapLongClick(classname.java:595)
04-29 16:39:05.371: W/System.err(15134): at com.google.android.gms.maps.GoogleMap$5.onMapLongClick(Unknown Source)
04-29 16:39:05.371: W/System.err(15134): at com.google.android.gms.internal.k$a.onTransact(Unknown Source)
04-29 16:39:05.381: W/System.err(15134): at android.os.Binder.transact(Binder.java:310)
04-29 16:39:05.381: W/System.err(15134): at com.google.android.gms.maps.internal.IOnMapLongClickListener$Stub$Proxy.onMapLongClick(IOnMapLongClickListener.java:93)
04-29 16:39:05.381: W/System.err(15134): at maps.i.s.a(Unknown Source)
04-29 16:39:05.381: W/System.err(15134): at maps.y.v.d(Unknown Source)
04-29 16:39:05.381: W/System.err(15134): at maps.y.bf.onLongPress(Unknown Source)
04-29 16:39:05.381: W/System.err(15134): at maps.d.v.onLongPress(Unknown Source)
04-29 16:39:05.381: W/System.err(15134): at maps.d.h.c(Unknown Source)
04-29 16:39:05.381: W/System.err(15134): at maps.d.h.c(Unknown Source)
04-29 16:39:05.381: W/System.err(15134): at maps.d.j.handleMessage(Unknown Source)
04-29 16:39:05.391: W/System.err(15134): at android.os.Handler.dispatchMessage(Handler.java:99)
04-29 16:39:05.391: W/System.err(15134): at android.os.Looper.loop(Looper.java:137)
04-29 16:39:05.391: W/System.err(15134): at android.app.ActivityThread.main(ActivityThread.java:5041)
04-29 16:39:05.391: W/System.err(15134): at java.lang.reflect.Method.invokeNative(Native Method)
04-29 16:39:05.391: W/System.err(15134): at java.lang.reflect.Method.invoke(Method.java:511)
04-29 16:39:05.391: W/System.err(15134): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
04-29 16:39:05.391: W/System.err(15134): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
04-29 16:39:05.391: W/System.err(15134): at dalvik.system.NativeStart.main(Native Method)
Come si può vedere dalla analisi dello stack, il comportamento previsto è aprire la finestra su una lunga pressione su un'istanza GoogleMap (utilizzando i MapFragments da API 2). Quindi il mio primo pensiero è stato che c'era un problema nel provare ad aprire da un frammento, quindi ho passato la chiamata alla Owning Activity. Stesso errore, stesso senza informazioni aggiuntive.
La mia ipotesi migliore a questo punto era che una nuova() chiamata non creava un'istanza sufficiente della classe/vista per fare chiamate a modificare la sua vista.Risulta che questo sembra essere almeno un po 'vero, come la migrazione del codice di modifica vista nell'attività e semplicemente aprendo l'attività in modo normale funziona: l'attività
Calling:
public void openMapDialog()
{
Intent intent = new Intent(this, DialogTestActivity.class);
startActivity(intent);
}
Nuovo codice della classe:
public class DialogTestActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// From: https://stackoverflow.com/questions/11425020/actionbar-in-a-dialogfragment
this.requestWindowFeature(Window.FEATURE_ACTION_BAR);
this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND, WindowManager.LayoutParams.FLAG_DIM_BEHIND);
LayoutParams params = this.getWindow().getAttributes();
params.alpha = 1.0f;
params.dimAmount = 0f;
this.getWindow().setAttributes((android.view.WindowManager.LayoutParams) params);
// This sets the window size, while working around the IllegalStateException thrown by ActionBarView
this.getWindow().setLayout(600,600);
setContentView(R.layout.buttons_test);
}
}
quindi credo che il punto di distacco me tutto questo è di chiarire che se si vuole fare ciò che i manifesti di cui sopra suggeriscono, non si può semplicemente new() un'attività e chiamano showAsPopup(). Questa potrebbe essere la mia inesperienza con Android che mostra attraverso, ma mentre questo sembra un po 'ovvio, sembra anche naturale interpretare showAsPopup() come chiamato dalla vista corrente, non dalla vista che si sta creando, mentre passi nell'istanza di attività (che sarebbe solo questo se doveva essere fatto in onCreate() come ho finito per fare).
Quindi, se l'intenzione è quella di chiamare showAsPopup() nell'attività creando e non l'attività creato, non è ovvio come ottenere l'istanza di attività che è modificabile prima onCreate() di essere chiamato. Il problema è che non è possibile chiamare cose come requestWindowFeature() dopo che viene chiamato setContentView() (example), che è un problema poiché viene generalmente chiamato onCreate().
Ancora una volta, se c'è un modo facile/migliore per farlo, apprezzerei molto il feedback. Speriamo che questo sia utile per le persone che vogliono usare questo approccio.
Questa è probabilmente un'attività in stile per apparire come una finestra di dialogo invece di un "vero dialogo". – Veeti