【问题标题】:Add back arrow in fragment在片段中添加后退箭头
【发布时间】: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 时,您都可以切换向上箭头。
  • 你能告诉我如何切换它吗?请注意我有:&lt;item name="windowActionBar"&gt;false&lt;/item&gt;&lt;item name="windowNoTitle"&gt;true&lt;/item&gt; 在 styles.xml @cricket_007
  • XML 无关紧要。 getSupportActionBar().setDisplayHomeAsUpEnabled(true)Activity 而不是 Fragment 就是我所说的

标签: android android-toolbar


【解决方案1】:

不要从布局中获取片段中的工具栏,而是尝试从 MainActivity 中引用它:

toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);

然后在片段中使用:

     ((AppCompatActivity)getActivity()).getSupportActionBar().setDisplayHomeAsUpEnabled(true);

【讨论】:

  • “尝试从你的 MainActivity 中引用它”似乎与“then in the Fragment”冲突
  • 此解决方案存在不同的问题。如果我想要导航片段中的菜单图标,那么该怎么做? Bcuz 如果我使用上面的代码,我会在每个片段中得到相同的 back arrow 图标和文本。我可以更改文本但如何显示菜单图标?
  • 可以通过Toolbar toolbar = (Toolbar)((AppCompatActivity)getActivity()).getSupportActionBar().getCustomView(); 在每个片段中添加对工具栏的引用那么你可以用 setIcon 方法改变图标
  • 添加什么?我在导航抽屉中有 2 个片段,我想要两个片段中的菜单图标,但两者都显示返回箭头图标。
  • 不想使用图标drawables。在片段中获取菜单图标还有其他想法吗?
【解决方案2】:

删除这一行

((AppCompatActivity)getActivity()).getSupportActionBar().setDisplayHomeAsUpEnabled(true);

来自onActivityCreated

尝试在简历中使用它

((AppCompatActivity)getView().getContext())getActivity()).getSupportActionBar().setDisplayHomeAsUpEnabled(true);

【讨论】:

  • 无法解析方法getActivity()getSupportActionBar()@sush
【解决方案3】:

以下两个功能应该启用

getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setHomeButtonEnabled(true);

以及设置返回按钮

@Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case android.R.id.home:
                this.finish();
                return true;
            default:
                return false;
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        return false;
    }

【讨论】:

  • 我添加了您的推荐。在片段中添加onCreateOptionsMenu 时显示错误,因此没有使用它。单击 TabLayout 选项卡之一中的按钮时,该应用程序仍然崩溃。 @种马
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-01-05
  • 1970-01-01
  • 1970-01-01
  • 2021-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多