StrikeForceZero と Luke Sleeman から提案されたソリューションの実装に問題があったため、私の経験を提供したいと思いました。足りないものがあると確信しているので、フィードバックをいただければ幸いです。
私がしたことは次のとおりです。
提供された PopupTheme を使用してスタイルを作成し、直接コピーして貼り付けます。
<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>
showAsPopup() メソッドをフラグメント内のメソッドとして追加し、偽のダイアログ フラグメントを直接コピー/貼り付けします。
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);
}
シンプルな new() 呼び出しを使用して新しいアクティビティのインスタンスを作成し、それを showAsPopup() メソッドに渡します。
DialogTestActivity test = new DialogTestActivity();
showAsPopup(test);
テストの目的で (アクション バーのあるダイアログとして表示されるアクティビティを開くことができることを確認しようとしていました)、ボタン ビュー API デモ (レイアウト ファイル用) から直接盗んだ非常に単純なテストを使用しました、APIデモのbuttons_1.xmlを参照してください):
public class DialogTestActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.buttons_test);
}
}
残念ながら、これを試すたびに、最初の呼び出し activity.requestWindowFeature(Window.FEATURE_ACTION_BAR); で未指定の null ポインター例外が発生します。
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)
スタック トレースからわかるように、意図した動作は、GoogleMap インスタンスを長押ししてウィンドウを開くことです (API 2 の MapFragments を使用)。したがって、最初に考えたのは、Fragment から開こうとしたことに問題があるということでした。そのため、呼び出しを所有する Activity に戻しました。同じエラー、追加情報なし。
この時点での私の最善の推測は、ビューを変更するための呼び出しを行うために、 new() 呼び出しがクラス/ビューを十分にインスタンス化していないということでした。ビュー変更コードをアクティビティに移行し、通常の方法でアクティビティを開くだけで機能するため、これは少なくともある程度は正しいように見えます。
通話アクティビティ:
public void openMapDialog()
{
Intent intent = new Intent(this, DialogTestActivity.class);
startActivity(intent);
}
新しいクラス コード:
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);
}
}
したがって、これをすべて投稿するポイントは、上記のポスターが示唆することを実行したい場合は、アクティビティを単に new() して showAsPopup() を呼び出すことはできないことを明確にすることだと思います。これは私の Android の表示経験不足かもしれませんが、これは少し明白に思えますが、作成中のビューではなく、現在のビューによって呼び出されているものとして showAsPopup() を解釈するのも当然のようです。これは、アクティビティ インスタンスを渡しているためです。 (私がやったように onCreate() で行われるはずだった場合、これはちょうどこれになります)。
そのため、作成されたアクティビティではなく作成中のアクティビティで showAsPopup() を呼び出すことが意図されている場合、 onCreate() が呼び出される前に変更可能な Activity インスタンスを取得する方法は明らかではありません。問題は、setContentView() が呼び出された後に requestWindowFeature() などを呼び出すことができないことです ( example )。これは、通常 onCreate() で呼び出されるため問題です。
繰り返しますが、これを行うための簡単でより良い方法があれば、フィードバックをいただければ幸いです。このアプローチを使用したい人にとって、これが役立つことを願っています。