【问题标题】:How can an activity use a Toolbar without extending AppCompatActivity活动如何在不扩展 AppCompatActivity 的情况下使用工具栏
【发布时间】:2015-10-27 00:36:51
【问题描述】:

我有一个活动HomeView,它已经扩展了另一个活动,它不能扩展AppCompatActivity。但是 HomeView 需要有一个 Toolbar。 Android 文档说任何需要工具栏的活动都必须扩展AppCompatActivity

我怎样才能绕过这个限制?

【问题讨论】:

  • 只需将工具栏添加到您的布局中就可以了。我基本上到处都使用工具栏。
  • 我不需要打电话给setSupportActionBar()吗?
  • 为什么不能使用AppCompatActivity
  • 我已经实现了Model-View_Presenter 设计,其中每个活动都继承自 GenericActivity。所以 Activity 不能从 AppCompatActivity 继承。
  • 但是您的 GenericActivity 可以继承 AppCompatActivity。

标签: android appcompatactivity


【解决方案1】:

您需要实现AppCompatCallback 并使用AppCompatDelegate。这是一篇关于如何使用它的优秀文章:https://medium.com/google-developer-experts/how-to-add-toolbar-to-an-activity-which-doesn-t-extend-appcompatactivity-a07c026717b3#.nuyghrgr9 并查看 https://developer.android.com/reference/android/support/v7/app/AppCompatDelegate.html 了解委托哪些方法。


AppCompatDelegate

这个类代表一个委托,您可以使用它来扩展 AppCompat 对任何 Activity 的支持。

使用 AppCompatDelegate 时,您应该在其中公开任何方法,而不是同名的 Activity 方法。这适用于:

addContentView(android.view.View, android.view.ViewGroup.LayoutParams)
setContentView(int)
setContentView(android.view.View)
setContentView(android.view.View, android.view.ViewGroup.LayoutParams)
requestWindowFeature(int)
invalidateOptionsMenu()
startSupportActionMode(android.support.v7.view.ActionMode.Callback)
setSupportActionBar(android.support.v7.widget.Toolbar)
getSupportActionBar()
getMenuInflater()

还有一些 Activity 生命周期方法应该代理给委托:

onCreate(android.os.Bundle)
onPostCreate(android.os.Bundle)
onConfigurationChanged(android.content.res.Configuration)
setTitle(CharSequence)
onStop()
onDestroy()

【讨论】:

  • @Amit 这是一个不同的问题。您也许应该接受正确的答案,以便其他人将来也可以受益。此外,我也在那里回答了你的问题,看看吧。
  • 教程的第一个链接对于分解和理解这些步骤非常有帮助。对我来说其他考虑因素包括:1)确保工具栏布局在主要内容布局之上[它在我的 RelativeLayout 中被隐藏],2)需要支持向上导航返回按钮,以及 3)似乎需要文本颜色设置为好。很高兴找到解决方案..谢谢!
【解决方案2】:

其实很简单:

public class YourActivity extends SomeActivity implements AppCompatCallback {

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // create the delegate
    delegate = AppCompatDelegate.create(this, this);
    delegate.onCreate(savedInstanceState);
    delegate.setContentView(R.layout.activity_details);

    // add the Toolbar
    Toolbar toolbar= (Toolbar) findViewById(R.id.toolbar);
    delegate.setSupportActionBar(toolbar);
  }

  @Override
  public void onSupportActionModeStarted(ActionMode mode) {
    // leave it empty
  }

  @Override
  public void onSupportActionModeFinished(ActionMode mode) {
    // leave it empty
  }

  @Nullable
  @Override
  public ActionMode onWindowStartingSupportActionMode(ActionMode.Callback callback) {
    return null;
  }

就是这样。请不要忘记在AndroidManifest.xml 中将AppTheme.NoActionBar 主题设置为YourActivity

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多