android - 从 fragment 中的 onItemClick 访问 BottomNavigationView 项目

标签 android android-fragments bottomnavigationview

我有一个 MainActivity,其中有一个 BottomNavigationView,其中有 3 个items。当我第一次打开应用程序时,只有一个启用,即第一个。

我在第一个 fragment (菜单中的第一个item)上有一个RecyclerView。当我点击 RecyclerView 的一个 item 时,我想切换到第二个 Fragment 并启用第二个和第三个 item .

我可以切换到第二个 Fragment,但无法再次设置项目启用。

带有 RecyclerView 的第一个 Fragment 是:

public class Homefragment extends Fragment implements OnItemClickListener {

    private ArrayList<fileItem> mfileList = new ArrayList<>();
    private RecyclerView mRecyclerView;
    private fileAdapter mAdapter;
    private RecyclerView.LayoutManager mLayoutManager;

    private BottomNavigationView bottomNav;

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

        View view = inflater.inflate(R.layout.fragment_home, container, false);

        Context context = getActivity();
        bottomNav = view.findViewById(R.id.bottom_navigation);

        // Listing all text files
        String path = Environment.getExternalStorageDirectory().toString()+"/FlexiCounts";
        File directory = new File(path);
        File[] filesList = directory.listFiles(new FilenameFilter() {
            public boolean accept(File directory, String name) {
                return name.toLowerCase().endsWith(".txt");
            }
        });

        setRecyclerView(view, filesList);

        return view;
    }

    private void setRecyclerView(View view, File[] files){

        if (files.length > 0) {

            for (int i = 0; i < files.length; i++) {
                mfileList.add(new fileItem(R.drawable.ic_account_balance_black_24dp, files[i].getName().replace(".txt", ""), "25-03-2020", "07-04-2020"));
            }

            mRecyclerView = view.findViewById(R.id.fileRecycler);
            mRecyclerView.setHasFixedSize(true);
            mLayoutManager = new LinearLayoutManager(getActivity());
            mAdapter = new fileAdapter(mfileList, this);

            mRecyclerView.setLayoutManager(mLayoutManager);
            mRecyclerView.setAdapter(mAdapter);

        }
    } 


    // the magic should happen here !
    @Override
    public void onItemClick(int position) {
        mfileList.get(position);
        getActivity().getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container_primary, new Dashboardfragment()).commit();

        bottomNav.getMenu().getItem(1).setEnabled(true);
        //bottomNav.getMenu().getItem(2).setEnabled(true);

    }
}

以下行不起作用:

bottomNav.getMenu().getItem(1).setEnabled(true);

它似乎指向一个空引用。我认为它在 onCreateView 方法中找不到使用 R.id.bottom_navigation 定义的 bottomNav 。事实上,bottom_navigation 包含在 MainActivity layout 中,但这应该不是问题。我收到此错误:

    --------- beginning of crash
2020-04-15 20:09:20.202 8673-8673/com.flexicounts.flexicounts E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.flexicounts.flexicounts, PID: 8673
    java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.Menu android.support.design.widget.BottomNavigationView.getMenu()' on a null object reference
        at com.flexicounts.flexicounts.Homefragment.onItemClick(Homefragment.java:145)
        at com.flexicounts.flexicounts.fileAdapter$fileViewHolder.onClick(fileAdapter.java:50)
        at android.view.View.performClick(View.java:5637)
        at android.view.View$PerformClick.run(View.java:22429)
        at android.os.Handler.handleCallback(Handler.java:751)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:154)
        at android.app.ActivityThread.main(ActivityThread.java:6119)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)

最佳答案

在主 Activity 中创建一个 BottomNavigationView getBottomNav() 方法,然后从 onItemClick 获取它

MainActivity中:

public BottomNavigationView getBottomNav(){ return findViewById(R.id.bottom_navigation); }

Homefragment中:

// the magic should happen here !
    @Override
    public void onItemClick(int position) {
        mfileList.get(position);
        getActivity().getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container_primary, new Dashboardfragment()).commit();

        ((MainActivity) getActivity()).getBottomNav().getMenu().getItem(1).setEnabled(true);
        //bottomNav.getMenu().getItem(2).setEnabled(true);

    }

关于android - 从 fragment 中的 onItemClick 访问 BottomNavigationView 项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61240695/

相关文章:

java - 检测并删除外部库中未使用的类

java - 为什么我只能显示 NFC 标签 (nDEF) 的前 4 页

java - 如何从 savedInstanceState 恢复 ViewPager

android - 将数据从 Activity 传递到 android 中的 fragment 不起作用

java - 如何从另一个 fragment 更改 fragment 并将其应用到 main_content 布局上?

Android SD卡写入失败,但不一致

android - 64 位 android,32 位应用程序与 32 位 native 库

java - Android:无法显示 JSON 数据,原因未知

java - 如何使用 ImageView 而不是菜单项制作底部导航栏?

android - 如何在 BottomNavigationView 中隐藏和显示菜单?