如何在不扩展AppCompatActivity的情况下使用工具栏

时间:2015-10-27 00:36:52

标签: android appcompatactivity

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

我如何解决这个限制?

2 个答案:

答案 0 :(得分:3)

您需要实施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()

答案 1 :(得分:0)

实际上,这很简单:

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;
  }

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