2014-12-27 100 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

相关问题