2014-12-27 43 views
0

我希望我的應用程序在創建主要活動後立即顯示側面抽屜式導航欄。 我的代碼工作正常 - 用戶啓動應用程序並獲取打開的抽屜 - 但我想實際請參閱側抽屜從左側滑動;相反,我發現抽屜完全打開。何時調用openDrawer()(或任何其他動畫)使其在啓動時可見?

什麼時候該打電話給openDrawer()? 已嘗試撥打電話:

  • 主要活動OnCreate;
  • 由抽屜託管的片段中的相似點。

我可以嘗試OnPrepareOptionsMenu,但我認爲它在活動生命週期中被多次調用。我也試過OnStart(),我擔心我的選項已經結束。 有什麼想法?我確信這很簡單,但我無法弄清楚。

編輯:我意識到我對這個問題的第一次論述(@Biu)並不清楚。我在這裏談論純粹的圖形問題。關鍵是:

  • 我在啓動時發生了一些事情;就我而言,我們正在談論導航抽屜滑入主屏幕,但它可以是我認爲的任何動畫;

  • 在我的情況下,人們可以只要致電:

    protected void OnCreate(Bundle b) { 
    ... 
    DrawerLayout.openDrawer() 
    } 
    
  • 上述解決方案效果很好。我正在談論的問題是圖形化的;通過上面的代碼,您可以啓動應用程序,並找到已打開的抽屜所涵蓋的主要活動。相反,我希望用戶能夠知道什麼是攻擊,看看面板來自哪裏;換句話說,就是看開場動畫。

所以我的問題是:什麼時候應該撥打openDrawer()?主Activity onCreate不太正確,因爲動畫在用戶看到屏幕上的東西之前結束。

我以爲有什麼東西開始當所有被加載的願望會更普遍。

+0

Android的用戶知道滑動菜單,它是已知的UI模式。所以你不需要在你的應用程序中實現這種行爲。 – gio 2014-12-27 16:05:03

+0

這就是我的想法。無論如何,我想知道什麼時候調用任何東西,以便在用戶啓動應用程序並且用戶界面(至少部分)加載時啓動它。 – natario 2014-12-27 16:07:48

+0

使用處理程序併發布調用opendrawer()的runnable。 – ElDuderino 2014-12-27 23:02:14

回答

1

@benjosantony建議你應該在onResume打開你的抽屜裏,但它不能保證該活動將是可見當時:

的onResume是不是你 活動是可見的最佳指標用戶;使用onWindowFocusChanged(布爾)肯定知道 你的活動是給用戶

你會認爲你可以只使用onWindowFocusChanged和做可見的,但你不能。目前仍然打破(至少對我來說)抽屜的動畫過渡動畫..

對於API 21+:
onEnterAnimationComplete在那裏你可以打開你的抽屜,看到動畫正常。然而21+是,這只是太大的要求..

對於較低的API:
我能想到的唯一可能的途徑是與主題調整除去活動的動畫:

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> 
    <item name="android:windowAnimationStyle">@null</item> 
</style> 

而且打開抽屜,像這樣:

private static final String DRAWER_STATE = "mDrawerOpened"; 
private DrawerLayout mDrawer; 
private ListView mDrawerList; 
private boolean mDrawerOpened; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    mDrawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
    mDrawerList = (ListView) findViewById(R.id.left_drawer); 
} 

@Override 
public void onWindowFocusChanged(boolean hasFocus) { 
    super.onWindowFocusChanged(hasFocus); 
    if (!mDrawerOpened && hasFocus) { 
     mDrawer.openDrawer(mDrawerList); 
     mDrawerOpened = true; 
    } 
} 

@Override 
protected void onSaveInstanceState(@NonNull Bundle outState) { 
    super.onSaveInstanceState(outState); 
    outState.putBoolean(DRAWER_STATE, mDrawerOpened); 
} 

@Override 
protected void onRestoreInstanceState(@NonNull Bundle savedInstanceState) { 
    super.onRestoreInstanceState(savedInstanceState); 
    mDrawerOpened = savedInstanceState.getBoolean(DRAWER_STATE); 
} 

這將動畫只有當活動開始的抽屜。

當你的活動異常破壞布爾值被保存,例如輪換或需要系統資源。

如果您不喜歡設置instanceState,您可以使用SharedPreferences作爲@Biu的建議,但IMO不會是正確的解決方案,因爲android已經提供了相應的工具,因此無需重新發明自行車。

+0

'onWindowFocusChanged'工作正常,謝謝。出於好奇,你能解釋一下'onSaveInstanceState'和'onRestoreInstanceState'是關於什麼的? – natario 2014-12-27 23:03:33

+0

@miav正如我所說,「當你的活動被異常破壞時,例如旋轉或需要系統資源'onSaveInstanceState被調用。正如它的名字所暗示的那樣,它只是保存這個活動的特定實例的狀態,並在稍後需要時恢復它(onRestoreInstanceState)。基本上它是在活動被破壞時使用的,但是可能會很快用以前的值重新創建。 – Simas 2014-12-27 23:17:23

0

您可以通過使用SharedPreferences

boolean firstTime = true; 

SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(this); 
public void onCreate(Bundle bundle) 
{ 
    if (pref.getBoolean("firstTime", true) == true) 
    { 
      drawer.openDrawer(yourDrawer); 
      firstTime = false; 
      pref.editor().putBoolean("firstTime", firstTime).apply(); 
    } 
    } 
+0

我正在尋找「本地」的東西,但無論如何感謝你。 – natario 2014-12-27 16:27:23

+0

沒有什麼內置的可以爲你做的,你必須自己實現它,這就是爲什麼說,沒有什麼你不能在Android中做,你只需要弄清楚如何實現它。 – Biu 2014-12-27 16:29:46

+0

雖然我沒有得到你的答案。這是一種讓它第一次運行的方式嗎?我已經設法做到了。我試圖以這樣的方式調用openDrawer(),以使用戶可以*看到*面板從屏幕側面滑動。 – natario 2014-12-27 20:53:22

-1

Activity

活動的前景生命週期的通話之間發生的onResume使用這個技巧(發)直到的onPause相應的調用()。在此期間,活動在所有其他活動之前,並與用戶進行交互。

因此,我認爲onResume是打開抽屜的最佳場所。

+0

從我讀的onResume()將被調用,如果我說,切換到Activity2,然後回到主要活動。這不是我要找的。當然它會被稱爲 – natario 2014-12-27 22:02:08

+0

。你問什麼時候調用openDrawer()以便用戶可以看到動畫。那個地方是簡歷。如果行爲已經顯示,您可以簡單地設置一些布爾值以避免打開抽屜。 (這是onResume從其他活動回來後被調用)。 – benjosantony 2014-12-27 22:10:56

+0

我明白了。可悲的是,即使onResume()還不夠,我發現抽屜已經打開。可能是由於我的舊設備。 – natario 2014-12-27 22:42:19

相關問題