Android BaseActivity中的工具栏

Android BaseActivity中的工具栏,android,android-fragments,android-activity,toolbar,Android,Android Fragments,Android Activity,Toolbar,我有多个活动和片段。我想在BaseActivity中设置工具栏(所以只设置一次)。但需要一个从片段访问工具栏的方法(如-show、hide、changetTitle等) 有什么建议吗 我已经尝试了下面的解决方案,但当我想隐藏片段时,会显示NPException public abstract class BaseActivity extends AppCompatActivity { Toolbar toolbar; @Override protected void onCrea

我有多个活动和片段。我想在BaseActivity中设置工具栏(所以只设置一次)。但需要一个从片段访问工具栏的方法(如-show、hide、changetTitle等) 有什么建议吗

我已经尝试了下面的解决方案,但当我想隐藏片段时,会显示NPException

public abstract class BaseActivity extends AppCompatActivity {

  Toolbar toolbar;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(getLayoutResource());
    configureToolbar();
  }

  protected abstract int getLayoutResource();

  private void configureToolbar() {
    toolbar = (Toolbar) findViewById(R.id.toolbar);
    if (toolbar != null) {
      setSupportActionBar(toolbar);
      getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    }
  }

 public void hideToolbar() {
   toolbar.setVisibility(View.GONE);
 }
我的活动

public class MyActivity extends BaseActivity() {
}
我在片段中称hideToolbar为:

public class MyFragment extends Fragment() {

onCreate() {

((Myactivity)getActivity).hideToolbar();
}
从碎片

getActivity().getSupportActionBar();
使用:


我已经在我的项目中加入了类似于你的东西。这是样品。你可以参考它

BaseActivity.java
class:

public abstract class BaseActivity extends AppCompatActivity {

   @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(getLayoutResource());
    }


    protected abstract int getLayoutResource();
}
public abstract class ToolbarActivity extends BaseActivity {
protected Toolbar toolbar;


@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    View contentView = findViewById(R.id.flToolbarContentContainer);
    if (contentView instanceof ViewGroup) {
        ((ViewGroup) contentView)
                .addView(LayoutInflater.from(this)
                        .inflate(getToolbarLayoutResource()
                                , (ViewGroup) contentView, false));
    }
    toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
 }

 @Override
 protected int getLayoutResource() {
     return R.layout.activity_toolbar;
 }

 protected abstract int getToolbarLayoutResource();

 public void showToolbar() {
     toolbar.setVisibility(View.VISIBLE);
 }

 public void hideToolbar() {
     toolbar.setVisibility(View.GONE);
 }
}
public class MainActivity extends ToolbarActivity {

@Override
protected int getToolbarLayoutResource() {
    return R.layout.activity_main;
}

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

    homeFragment = HomeFragment.newInstance();
    getSupportFragmentManager()
            .beginTransaction()
            .replace(R.id.llMainActivityContainer, homeFragment)
            .commit();
}
}
ToolBarActivity.java
class:

public abstract class BaseActivity extends AppCompatActivity {

   @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(getLayoutResource());
    }


    protected abstract int getLayoutResource();
}
public abstract class ToolbarActivity extends BaseActivity {
protected Toolbar toolbar;


@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    View contentView = findViewById(R.id.flToolbarContentContainer);
    if (contentView instanceof ViewGroup) {
        ((ViewGroup) contentView)
                .addView(LayoutInflater.from(this)
                        .inflate(getToolbarLayoutResource()
                                , (ViewGroup) contentView, false));
    }
    toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
 }

 @Override
 protected int getLayoutResource() {
     return R.layout.activity_toolbar;
 }

 protected abstract int getToolbarLayoutResource();

 public void showToolbar() {
     toolbar.setVisibility(View.VISIBLE);
 }

 public void hideToolbar() {
     toolbar.setVisibility(View.GONE);
 }
}
public class MainActivity extends ToolbarActivity {

@Override
protected int getToolbarLayoutResource() {
    return R.layout.activity_main;
}

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

    homeFragment = HomeFragment.newInstance();
    getSupportFragmentManager()
            .beginTransaction()
            .replace(R.id.llMainActivityContainer, homeFragment)
            .commit();
}
}
activity\u toolbar.xml
布局文件:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/rlToolbarContainer"
android:layout_width="match_parent"
android:layout_height="match_parent">


<android.support.v7.widget.Toolbar
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="?attr/actionBarSize"
    android:layout_toLeftOf="@+id/pbToolbarActivity"
    android:background="@color/blue_panel_day_background"
    android:theme="@style/ToolbarTheme" />

<FrameLayout
    android:id="@+id/flToolbarContentContainer"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_below="@id/toolbar" />
 </RelativeLayout>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:id="@+id/llMainActivityContainer"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:orientation="vertical">

</LinearLayout>
activity\u main.xml
布局文件:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/rlToolbarContainer"
android:layout_width="match_parent"
android:layout_height="match_parent">


<android.support.v7.widget.Toolbar
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="?attr/actionBarSize"
    android:layout_toLeftOf="@+id/pbToolbarActivity"
    android:background="@color/blue_panel_day_background"
    android:theme="@style/ToolbarTheme" />

<FrameLayout
    android:id="@+id/flToolbarContentContainer"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_below="@id/toolbar" />
 </RelativeLayout>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:id="@+id/llMainActivityContainer"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:orientation="vertical">

</LinearLayout>

要从
Fragment
访问
ActionBar
,请尝试以下方法

ActionBar actionBar = ((AppCompatActivity) getActivity()).getSupportActionBar();

您现在可以访问
ActionBar

的所有方法。当我尝试使用添加更多细节到您的问题时,工具栏始终为空。如何在片段中调用
hideToolbar
方法?。派生活动是什么样子的?您刚刚提供了抽象类定义,而不是在没有错误的情况下很难回答的实现,但是当我调用.hideToolbar时,工具栏仍然在
MyFragment
->
((AppCompatActivity)getActivity()).getSupportActionBar().hide()中从类中删除抽象并尝试不使用extand baseactivity。仍然不工作,我不知道问题出在哪里什么是createNavbar方法?Ohhhhhhhh!!!这是一种用于
导航抽屉
的方法。它不需要在那里。