我的应用有一个工具栏,应该出现在每个视图上。目前,我在onCreate()
方法中针对每项活动执行以下操作:
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
这是否需要在每个Activity中的每个onCreate()
方法中完成,还是有更简单的方法?另外,作为一个附带问题,我如何实现" back"工具栏中的功能,如果用户单击它,则会使用户返回一个操作?
答案 0 :(得分:18)
为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
并实施后退功能。
最后不要忘记在每个活动ToolBar
中加入layout
。
修改强>
在每个getLayoutResource()
中覆盖该方法Activity
并传递布局ID。
public class MainActivity extends BaseActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public int getLayoutResource() {
return R.layout.activity_main;
}
答案 1 :(得分:2)
这是我的实施。它从接受的答案中删除了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>
答案 2 :(得分:0)
如果您已使用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
,那么创建BaseFragment
并延伸Fragment
并将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代码。
现在,每个视图(活动)都会BaseActivity
而不是AppCompatActivity
或ActionBarActivity
,因此您可以在每个视图中访问Toolbar
。
public class YourActivity extends BaseActivity{
//your code
}
<强> EDIT1:强>
<强> 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);
在setSupportActionBar(toolbar);
中的BaseActivity
下方添加以下两行。
我希望它有所帮助!
答案 3 :(得分:0)
这取决于你的实现,但如果你想避免样板代码,你应该使用良好的编程OO。
使用片段的示例。
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);
}
}
}
我希望这可以给你一个想法。
答案 4 :(得分:0)
创建基本活动并在此课程中初始化工具栏。现在它可以扩展到所有其他子活动。
FirtActivity extends BaseActivity
SecondActivity extends BaseActivity
在基本活动收费栏后退按钮中,您可以按照下面提到的方式进行检查
if(this instance of FirstActivity){
//do stuff here
}else if(this instance of SecondActivity){
//do stuff here
}