How can an activity use a Toolbar without extending AppCompatActivity

前端 未结 2 1803
别那么骄傲
别那么骄傲 2021-01-20 06:05

I have an activity HomeView which already extends another activity and it cannot extend AppCompatActivity. But HomeView needs to have a Toolbar. Th

相关标签:
2条回答
  • 2021-01-20 06:23

    Actually, it is pretty simple:

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

    That's it. Please, don't forget to set a AppTheme.NoActionBar theme to YourActivity in the AndroidManifest.xml.

    0 讨论(0)
  • 2021-01-20 06:38

    You need to implement AppCompatCallback and use AppCompatDelegate. Here's an excellent article about how to use it: https://medium.com/google-developer-experts/how-to-add-toolbar-to-an-activity-which-doesn-t-extend-appcompatactivity-a07c026717b3#.nuyghrgr9 and also check out https://developer.android.com/reference/android/support/v7/app/AppCompatDelegate.html for knowing which methods to delegate.


    AppCompatDelegate

    This class represents a delegate which you can use to extend AppCompat's support to any Activity.

    When using an AppCompatDelegate, you should any methods exposed in it rather than the Activity method of the same name. This applies to:

    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()
    

    There also some Activity lifecycle methods which should be proxied to the delegate:

    onCreate(android.os.Bundle)
    onPostCreate(android.os.Bundle)
    onConfigurationChanged(android.content.res.Configuration)
    setTitle(CharSequence)
    onStop()
    onDestroy()
    
    0 讨论(0)
提交回复
热议问题