遇到了一些麻煩實施從StrikeForceZero和盧克斯利曼建議的解決方案,所以我想貢獻我的經驗。我敢肯定,這只是我缺少的東西,所以反饋將非常感激。
我所做的是以下幾點:
使用提供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 demo中獲取(對於佈局文件,請參閱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);
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)
你可以從堆棧跟蹤看,預期的行爲(使用API 2 MapFragments)打開上長按上GoogleMap的實例的窗口。所以我首先想到的是試圖從片段中打開的問題,所以我把這個回調傳遞給了擁有的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);
}
}
所以我想我張貼這一切的問題是要弄清楚,如果你想要做什麼上面的海報建議,你不能只是新的()的活動,並呼籲showAsPopup()。這可能是我對Android的經驗不足,雖然這看起來有點明顯,但將showAsPopup()解釋爲由當前視圖調用,而不是在創建視圖時看起來很自然,因爲您正在傳遞活動實例(如果它應該在onCreate()中完成,就像我最終做的那樣,這只是這個)。
所以,如果目的是要調用showAsPopup()在創建活動,而不是創建活動,這不是明顯的如何得到活動實例,它是之前的onCreate修改()被調用。問題是你不能在調用setContentView()之後調用諸如requestWindowFeature()之類的東西(example),這是一個問題,因爲它通常在onCreate()中調用。
再次,如果有一個簡單/更好的方法來做到這一點,我將非常感激反饋。希望這對那些想要使用這種方法的人有所幫助。
這可能是一個看似對話而不是「真實對話」的活動。 – Veeti