【发布时间】:2016-10-11 01:08:54
【问题描述】:
我在 MainActivity 中有一个框架布局,并且我已将 TabFragment 片段附加到活动中。 TabFragment 具有 TabLayout 和 Navigation Drawer。我使用此链接对 TabFragment 中样式工具栏的推荐答案。但是,当我在 NewFragment 中使用 ((AppCompatActivity)getActivity()).getSupportActionBar().setDisplayHomeAsUpEnabled(true); 时(它在从选项卡之一单击按钮时打开),应用程序会因 NullPointerException 而崩溃。我想要后退箭头而不使用任何可绘制图标。感谢您在这方面的任何帮助。
FATAL EXCEPTION: main
Process: com.sam.pagersliding, PID: 7652
java.lang.NullPointerException
at com.sam.pagersliding.NewFragment.onCreate(NewFragment.java:27)
at android.support.v4.app.Fragment.performCreate(Fragment.java:1951)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1029)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1252)
at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:742)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1617)
at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:517)
at android.os.Handler.handleCallback(Handler.java:808)
at android.os.Handler.dispatchMessage(Handler.java:103)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:5388)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:655)
at dalvik.system.NativeStart.main(Native Method)
public class NewFragment extends Fragment{
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
((AppCompatActivity)getActivity()).getSupportActionBar().setDisplayHomeAsUpEnabled(true);
setHasOptionsMenu(true);
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return inflater.inflate(R.layout.newfrag, container, false);
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
switch (id){
case android.R.id.home:
getActivity().onBackPressed();
break;
}
return super.onOptionsItemSelected(item);
}
}
public class TabFragment extends Fragment{
Toolbar toolbar;
private TabLayout tabLayout;
private ViewPager viewPager;
public static DrawerLayout mDrawerLayout;
NavigationView navigationView;
ActionBarDrawerToggle mDrawerToggle;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return inflater.inflate(R.layout.tabfrag, container, false);
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
toolbar = (Toolbar) view.findViewById(R.id.toolbar);
tabLayout = (TabLayout) view.findViewById(R.id.tabs);
viewPager = (ViewPager) view.findViewById(R.id.viewpager);
mDrawerLayout = (DrawerLayout) view.findViewById(R.id.drawer_layout);
navigationView = (NavigationView) view.findViewById(R.id.navigation_view);
setupViewPager(viewPager);
tabLayout.setupWithViewPager(viewPager);
mDrawerToggle = new ActionBarDrawerToggle(getActivity(),mDrawerLayout, toolbar,R.string.app_name,R.string.app_name);
mDrawerToggle.syncState();
navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(MenuItem menuItem) {
mDrawerLayout.closeDrawers();
if (menuItem.getItemId() == R.id.nav_one) {
NavOne nav1 = new NavOne();
((MainActivity)getActivity()).replaceFragment(nav1);
mDrawerLayout.closeDrawer(navigationView);
}
if (menuItem.getItemId() == R.id.nav_two) {
NavTwo nav2 = new NavTwo();
((MainActivity)getActivity()).replaceFragment(nav2);
mDrawerLayout.closeDrawer(navigationView);
}
return false;
}
});
}
private void setupViewPager(ViewPager viewPager) {
ViewPagerAdapter adapter = new ViewPagerAdapter(getChildFragmentManager());
adapter.addFragment(new OneFragment(), "ONE");
adapter.addFragment(new TwoFragment(), "TWO");
viewPager.setAdapter(adapter);
}
class ViewPagerAdapter extends FragmentPagerAdapter {
private final List<Fragment> mFragmentList = new ArrayList<>();
private final List<String> mFragmentTitleList = new ArrayList<>();
public ViewPagerAdapter(FragmentManager manager) {
super(manager);
}
@Override
public Fragment getItem(int position) {
return mFragmentList.get(position);
}
@Override
public int getCount() {
return mFragmentList.size();
}
public void addFragment(Fragment fragment, String title) {
mFragmentList.add(fragment);
mFragmentTitleList.add(title);
}
@Override
public CharSequence getPageTitle(int position) {
return mFragmentTitleList.get(position);
}
}
}
public class MainActivity extends AppCompatActivity {
FragmentManager myFragmentManager;
FragmentTransaction myFragmentTransaction;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Attach main fragment to activity
if (findViewById(R.id.containerView) != null) {
if (savedInstanceState != null) {
return;
}
myFragmentManager = getSupportFragmentManager();
myFragmentTransaction = myFragmentManager.beginTransaction();
myFragmentTransaction.replace(R.id.containerView, new TabFragment()).commit();
}
}
public void replaceFragment(Fragment fragment){
FragmentTransaction t = getSupportFragmentManager().beginTransaction();
t.replace(R.id.containerView, fragment).addToBackStack(null);
t.commit();
}
}
【问题讨论】:
-
"应用程序崩溃" -- 请editlogcat 提问,然后
-
添加了 Logcat。它在同一行`((AppCompatActivity)getActivity()).getSupportActionBar().setDisplayHomeAsUpEnabled(true);`@cricket_007
-
为什么要从 Fragment 设置 Activity 的工具栏?这似乎是一个糟糕的设计。每当您在 Activity 代码中使用 FragmentTransaction 时,您都可以切换向上箭头。
-
你能告诉我如何切换它吗?请注意我有:
<item name="windowActionBar">false</item>和<item name="windowNoTitle">true</item>在 styles.xml @cricket_007 -
XML 无关紧要。
getSupportActionBar().setDisplayHomeAsUpEnabled(true)在 Activity 而不是 Fragment 就是我所说的