2012-03-04 35 views
0

這裏是我的主要活動在運行時將方向改爲肖像時,強制關閉Android Popupwindow,爲什麼?

public static boolean popupStatus=false; 
    public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    if (savedInstanceState != null){ 
    popupStatus = savedInstanceState.getBoolean("Open"); 
    } 
    setContentView(R.layout.main); 

    public void onSaveInstanceState(Bundle savedInstanceState) {  

    savedInstanceState.putBoolean("Open", DateTimePicker.openPopup); 
    super.onSaveInstanceState(savedInstanceState); 
} 

我有DateTimePicker.java類有1個按鈕和1個TextView的。點擊按鈕,我的另一個類Calendar.java得到在PopupWindow填充,這個彈出窗口顯示我的類Calendar.java。我爲肖像和風景模式創建了Calendar.java類的不同佈局。下面是一些DateTimePicker.java代碼片段,

public static boolean openPopup = false; 

    textView = new TextView(this.getContext()); 
    this.addView(textView, layoutParams); 
    button = new Button(this.getContext()); 
    button.setText("C"); 
    this.addView(button, layoutParams1); 
    button.setOnClickListener(this); 
    if(Main.popupStatus){ 
      button.performClick(); 
     } 

    public void onClick(View v) { 
    if(Main.popupStatus){ 
       new Handler().postDelayed(new Runnable() { 
        public void run() { 
         openCalendar(); 
        } 
       }, 100); 
     } 
     else{ 
      openCalendar(); 
     } 

    private void openCalendar() { 
    Calendar calendar = new Calendar(this.getContext()); 
    if(portrait.equals(orientation)){ 
     pw = new PopupWindow(calendarLayout, 245, 284, true); 
    } 
    else{ 
     pw = new PopupWindow(calendarLayout, 295, 240, true); 
    } 
    pw.setOutsideTouchable(false); 
    pw.showAtLocation(this, Gravity.NO_GRAVITY, 10, 80); 
    openPopup = true; 
} 

    public void closeCalendar(){ 
    pw.dismiss(); 
    openPopup = false; 
     } 

main.xml中包含DateTimePicker。 其實我想讓我的彈出式窗口即使在運行時改變方向時也打開,所以我通過在openCalendar()方法中設置標誌openPopup = true;並且如果打開並且在運行時改變方向,該標誌將被保存在onSaveInstanceState()方法。方向改變後,將在onCreate()中進行檢查,彈出窗口將打開相應的方向模式。我希望你明白我的觀點。

問題:最初當我在縱向模式中點擊按鈕時,彈出窗口彈出縱向佈局。然後在不關閉彈出窗口的情況下,將方向改爲橫向。更改後,我可以看到我的彈出窗口完好無損,並出現在景觀佈局的屏幕上。直到現在它工作正常。但是,如果彈出式窗口在橫向模式下打開,然後我改變方向爲縱向,縱向佈局的彈出窗口沒有出現,我看到了FORCE CLOSE消息:/請幫助,因爲我在它後面工作了很長時間,線索。我會非常感謝大家。謝謝!

PS:改變方向意味着我按CTRL + F11和模擬器

+0

你不需要使用handler.postDelayed打開一個彈出窗口,因爲它與onClick事件相關聯。只有當您在活動加載時自動顯示它時才需要此選項。因此,在您的onClick中,您可以簡單地調用** openCalendar()** – waqaslam 2012-03-04 11:22:24

+0

不,它不是一個糟糕的編程。使用它,如果它爲你工作正常:) – waqaslam 2012-03-04 16:18:17

回答

1

仿真器具有奇數功能(有些認爲這是一個錯誤)的變化方向,其中從橫向變爲縱向在模擬器原因兩個配置更改和兩次重新啓動您的活動。 (一個配置更改是方向,另一個是鍵盤狀態的模擬更改。)配置更改的時間安排經常會導致這樣的崩潰。嘗試添加此屬性:

android:configChanges="keyboard|keyboardHidden" 

到清單中的<activity>標記。看看是否改善了這種情況。

+0

@noobnicks - 添加該屬性意味着你的活動將不會重新啓動時,鍵盤狀態改變,但它仍然會重新啓動方向的變化。這就是你需要的全部,因爲(從你所描述的)你的活動不使用隨鍵盤狀態改變的資源。 (如果這解決了您的問題,您可以通過點擊複選標記將我的答案標記爲解決方案。) – 2012-03-04 10:20:40

0

確保您已在layout-land文件夾中定義了您的佈局,並確保不會一次又一次調用onCreate。 android:configChanges =「keyboard | keyboardHidden」把它放在你的清單文件中,以便在改變方向時保留狀態

相關問題