在每个 Activity 上调用工具栏
Calling Toolbar on each Activity
我的应用程序有一个应该出现在每个视图上的工具栏。目前,我在我的 onCreate()
方法中为每个 Activity 执行以下操作:
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
是否需要在每个 Activity 的每个 onCreate()
方法中都这样做,还是有更简单的方法?另外,作为附带问题,我如何在工具栏中实现 "back" 功能,使用户在单击它时返回一个操作?
如果您使用了 Activity
然后创建 BaseActivity
扩展 AppCompatActivity
或 ActionBarActivity
(已弃用)并将 Toolbar
代码移动到 BaseActivity
.
public class BaseActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
}
}
如果您使用了 Fragment
,则创建扩展 Fragment
的 BaseFragment
,并将 Toolbar
代码移动到 BaseFragment
。
public class BaseFragment extends Fragment {
View main;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
main = inflater.inflate(R.layout.fragment_about, container, false);
Toolbar toolbar = (Toolbar) main.findViewById(R.id.toolbar);
getActivity().setSupportActionBar(toolbar);
return main;
}
}
在 main
XML 布局中,您必须添加 Toolbar
xml 代码。
现在在每个视图中 (Activity) 扩展 BaseActivity
而不是 AppCompatActivity
或 ActionBarActivity
因此您可以在每个视图中访问 Toolbar
。
public class YourActivity extends BaseActivity{
//your code
}
编辑 1:
main.xml
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:theme="@style/toolbarTheme"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/green"
android:minHeight="?attr/actionBarSize" />
</RelativeLayout>
EDIT2:
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setHomeButtonEnabled(true);
在 BaseActivity
中的 setSupportActionBar(toolbar);
下面添加这两行。
希望对您有所帮助!
为Activity
创建基地class
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);
}
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
FragmentManager fm = getSupportFragmentManager();
if (fm != null && fm.getBackStackEntryCount() > 0) {
fm.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
} else {
finish();
}
return true;
default:
return super.onOptionsItemSelected(item);
}
}
}
并且在每个 Activity
中扩展此 BaseActivity
以获得 ToolBar
并实现后退功能。
最后不要忘记在每个 activity layout
.
中包含 ToolBar
编辑:
在每个 Activity
中覆盖该方法 getLayoutResource()
并传递布局 ID。
public class MainActivity extends BaseActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public int getLayoutResource() {
return R.layout.activity_main;
}
这取决于您的实现,但如果您想避免样板代码,您应该使用良好的面向对象编程。
一个使用片段的例子。
public abstract class FragmentBase extends Fragment {
protected void settingsToolbar(View rootView) {
Toolbar toolbar = (Toolbar) rootView.findViewById(R.id.toolbar);
((AppCompatActivity) getActivity()).setSupportActionBar(toolbar);
final ActionBar actionBar = ((AppCompatActivity) getActivity()).getSupportActionBar();
if (actionBar != null) {
// TODO add your code and your requirements
actionBar.setDisplayShowTitleEnabled(true);
actionBar.setDisplayHomeAsUpEnabled(true);
}
}
}
希望这能给你一个思路。
创建一个基础 activity 并在此 class 中初始化您的工具栏。现在它可以扩展到所有其他 child activity.
FirtActivity extends BaseActivity
SecondActivity extends BaseActivity
在基地activity收费栏后退按钮点击你可以像下面提到的方式检查
if(this instance of FirstActivity){
//do stuff here
}else if(this instance of SecondActivity){
//do stuff here
}
这是我的实现。它从接受的答案中删除了 getLayoutResources() 的需要,并在所有活动中恢复 "setContentView()" 正常
public abstract class BaseActivity extends AppCompatActivity {
Toolbar toolbar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
protected boolean useToolbar() {
return true;
}
@Override
public void setContentView(int layoutResID) {
View view = getLayoutInflater().inflate(layoutResID, null);
configureToolbar(view);
super.setContentView(view);
}
private void configureToolbar(View view) {
toolbar = (Toolbar) view.findViewById(R.id.toolbar);
if (toolbar != null) {
if (useToolbar()) {
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
} else {
toolbar.setVisibility(View.GONE);
}
}
}
}
从这里开始,您只需扩展 BaseActivity。如果您不想要工具栏,则必须重写 useToolbar()。
别忘了在顶部添加 activity.xml
<include layout="@layout/toolbar" />
toolbar.xml
<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:layout_scrollFlags="scroll|enterAlways"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />
</merge>
我的应用程序有一个应该出现在每个视图上的工具栏。目前,我在我的 onCreate()
方法中为每个 Activity 执行以下操作:
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
是否需要在每个 Activity 的每个 onCreate()
方法中都这样做,还是有更简单的方法?另外,作为附带问题,我如何在工具栏中实现 "back" 功能,使用户在单击它时返回一个操作?
如果您使用了 Activity
然后创建 BaseActivity
扩展 AppCompatActivity
或 ActionBarActivity
(已弃用)并将 Toolbar
代码移动到 BaseActivity
.
public class BaseActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
}
}
如果您使用了 Fragment
,则创建扩展 Fragment
的 BaseFragment
,并将 Toolbar
代码移动到 BaseFragment
。
public class BaseFragment extends Fragment {
View main;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
main = inflater.inflate(R.layout.fragment_about, container, false);
Toolbar toolbar = (Toolbar) main.findViewById(R.id.toolbar);
getActivity().setSupportActionBar(toolbar);
return main;
}
}
在 main
XML 布局中,您必须添加 Toolbar
xml 代码。
现在在每个视图中 (Activity) 扩展 BaseActivity
而不是 AppCompatActivity
或 ActionBarActivity
因此您可以在每个视图中访问 Toolbar
。
public class YourActivity extends BaseActivity{
//your code
}
编辑 1:
main.xml
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:theme="@style/toolbarTheme"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/green"
android:minHeight="?attr/actionBarSize" />
</RelativeLayout>
EDIT2:
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setHomeButtonEnabled(true);
在 BaseActivity
中的 setSupportActionBar(toolbar);
下面添加这两行。
希望对您有所帮助!
为Activity
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);
}
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
FragmentManager fm = getSupportFragmentManager();
if (fm != null && fm.getBackStackEntryCount() > 0) {
fm.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
} else {
finish();
}
return true;
default:
return super.onOptionsItemSelected(item);
}
}
}
并且在每个 Activity
中扩展此 BaseActivity
以获得 ToolBar
并实现后退功能。
最后不要忘记在每个 activity layout
.
ToolBar
编辑:
在每个 Activity
中覆盖该方法 getLayoutResource()
并传递布局 ID。
public class MainActivity extends BaseActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public int getLayoutResource() {
return R.layout.activity_main;
}
这取决于您的实现,但如果您想避免样板代码,您应该使用良好的面向对象编程。
一个使用片段的例子。
public abstract class FragmentBase extends Fragment {
protected void settingsToolbar(View rootView) {
Toolbar toolbar = (Toolbar) rootView.findViewById(R.id.toolbar);
((AppCompatActivity) getActivity()).setSupportActionBar(toolbar);
final ActionBar actionBar = ((AppCompatActivity) getActivity()).getSupportActionBar();
if (actionBar != null) {
// TODO add your code and your requirements
actionBar.setDisplayShowTitleEnabled(true);
actionBar.setDisplayHomeAsUpEnabled(true);
}
}
}
希望这能给你一个思路。
创建一个基础 activity 并在此 class 中初始化您的工具栏。现在它可以扩展到所有其他 child activity.
FirtActivity extends BaseActivity
SecondActivity extends BaseActivity
在基地activity收费栏后退按钮点击你可以像下面提到的方式检查
if(this instance of FirstActivity){
//do stuff here
}else if(this instance of SecondActivity){
//do stuff here
}
这是我的实现。它从接受的答案中删除了 getLayoutResources() 的需要,并在所有活动中恢复 "setContentView()" 正常
public abstract class BaseActivity extends AppCompatActivity {
Toolbar toolbar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
protected boolean useToolbar() {
return true;
}
@Override
public void setContentView(int layoutResID) {
View view = getLayoutInflater().inflate(layoutResID, null);
configureToolbar(view);
super.setContentView(view);
}
private void configureToolbar(View view) {
toolbar = (Toolbar) view.findViewById(R.id.toolbar);
if (toolbar != null) {
if (useToolbar()) {
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
} else {
toolbar.setVisibility(View.GONE);
}
}
}
}
从这里开始,您只需扩展 BaseActivity。如果您不想要工具栏,则必须重写 useToolbar()。
别忘了在顶部添加 activity.xml
<include layout="@layout/toolbar" />
toolbar.xml
<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:layout_scrollFlags="scroll|enterAlways"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />
</merge>