【问题标题】:Create NavigationDrawer in Fragment, NOT Activity在 Fragment 中创建 NavigationDrawer,而不是 Activity
【发布时间】:2020-03-14 08:39:36
【问题描述】:

想知道如何在 Fragment(在本例中是我的 HomeFragment)中而不是在 Activity 中创建 NavigationDrawer。已经看到了有关如何在 Activity 中创建 NavigationDrawer 的所有内容,例如 MainActivity,但我对这个项目的目标是仅为 HomeFragment 创建 NavigationDrawer。不希望任何其他片段包含它。抽屉菜单将包含编辑配置文件、设置和注销。下面我发布了我所做的......有更好的方法吗?代码似乎有点尴尬。

我看过的每个视频,每个帖子都是关于在活动中创建 NavigationDrawer,所以我想知道 Fragment 的代码会是什么样子。我试着像你对 Activity 那样做,但它不起作用。

你们下面有我的 HomeFragment.java 和 fragment_home.xml


fragment_home.xml


    <?xml version="1.0" encoding="utf-8"?>
    <androidx.drawerlayout.widget.DrawerLayout     xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/drawer_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fitsSystemWindows="true"
        tools:context=".Fragment.HomeFragment"
        tools:openDrawer="start">

        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent">

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:orientation="vertical">

                <com.google.android.material.appbar.AppBarLayout
                    android:id="@+id/bar"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:background="?android:attr/windowBackground">

                    <androidx.appcompat.widget.Toolbar
                        android:id="@+id/toolbar_home_fragment"
                        android:layout_width="match_parent"
                        android:layout_height="?attr/actionBarSize"
                        android:background="?android:attr/windowBackground"
                        android:elevation="4dp"
                        app:popupTheme="@style/ThemeOverlay.AppCompat.Light">

                        <RelativeLayout
                            android:layout_width="match_parent"
                            android:layout_height="wrap_content">

                            <ImageView
                                android:id="@+id/events_logo_main_activity"
                                android:layout_width="180dp"
                                android:layout_height="45dp"
                                android:layout_centerInParent="true"
                                android:layout_marginTop="10dp"
                                android:src="@drawable/events_logo_black_max_size" />

                            <ImageView
                                android:id="@+id/camera_create_an_event_main_activity"
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:layout_alignParentEnd="true"
                                android:layout_centerInParent="true"
                                android:layout_marginEnd="11dp"
                                android:src="@drawable/ic_camera_create_events_home_fragment_black" />

                            <ImageView
                                android:id="@+id/three_bars_settings_main_activity"
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:layout_alignParentStart="true"
                                android:layout_centerInParent="true"
                                android:src="@drawable/ic_three_bars_settings_home_fragment_black" />

                        </RelativeLayout>

                    </androidx.appcompat.widget.Toolbar>

                </com.google.android.material.appbar.AppBarLayout>

                <androidx.recyclerview.widget.RecyclerView
                    android:id="@+id/recycler_view"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_below="@+id/bar">

                </androidx.recyclerview.widget.RecyclerView>

            </LinearLayout>

            <ProgressBar
                android:id="@+id/progress_circular"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_centerInParent="true" />

        </RelativeLayout>

        <com.google.android.material.navigation.NavigationView
            android:id="@+id/nav_view"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_gravity="start"
            app:headerLayout="@layout/header"
            app:itemTextColor="@color/colorPrimaryAqua50"
            app:menu="@menu/drawer_menu" />

    </androidx.drawerlayout.widget.DrawerLayout>


HomeFragment.java

package com.e.events.Fragment;

import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;

import androidx.annotation.NonNull;
import androidx.appcompat.app.ActionBarDrawerToggle;
import androidx.appcompat.widget.Toolbar;
import androidx.core.view.GravityCompat;
import androidx.drawerlayout.widget.DrawerLayout;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.TextView;

import com.e.events.Adapter.PostAdapter;
import com.e.events.EditProfileActivity;
import com.e.events.MainActivity;
import com.e.events.Model.Post;
import com.e.events.PostActivity;
import com.e.events.R;
import com.google.android.material.navigation.NavigationView;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;

import java.util.ArrayList;
import java.util.List;

public class HomeFragment extends Fragment {

    private ImageView options;

    private DrawerLayout drawer;

    ProgressBar progressBar;

    private RecyclerView recyclerView;
    private PostAdapter postAdapter;
    private List<Post> postLists;

    private ImageView camera_create_event;

    private List<String> followingList;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_home, container, false);

        recyclerView = view.findViewById(R.id.recycler_view);
        recyclerView.setHasFixedSize(true);
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getContext());
        linearLayoutManager.setReverseLayout(true);
        linearLayoutManager.setStackFromEnd(true);
        recyclerView.setLayoutManager(linearLayoutManager);
        postLists = new ArrayList<>();
        postAdapter = new PostAdapter(getContext(), postLists);
        recyclerView.setAdapter(postAdapter);

        progressBar = view.findViewById(R.id.progress_circular);

        options = view.findViewById(R.id.three_bars_settings_main_activity);

        options.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (drawer.isDrawerOpen(GravityCompat.START)) {
                    drawer.closeDrawer(GravityCompat.START);
                } else {
                    drawer.openDrawer(GravityCompat.START);
                }
            }
        });

        Toolbar toolbar = view.findViewById(R.id.toolbar_home_fragment);

        drawer = view.findViewById(R.id.drawer_layout);

        camera_create_event = view.findViewById(R.id.camera_create_an_event_main_activity);

        camera_create_event.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(getActivity(), PostActivity.class);
                startActivity(intent);
            }
        });

        checkFollowing();

        return view;
    }

    private void checkFollowing() {
        followingList = new ArrayList<>();

        DatabaseReference reference = FirebaseDatabase.getInstance().getReference("Follow")
                .child(FirebaseAuth.getInstance().getCurrentUser().getUid())
                .child("following");

        reference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                followingList.clear();
                for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
                    followingList.add(snapshot.getKey());
                }

                readPosts();
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });
    }

    private void readPosts() {
        DatabaseReference reference = FirebaseDatabase.getInstance().getReference("Posts");

        reference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                postLists.clear();
                for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
                    Post post = snapshot.getValue(Post.class);
                    for (String id : followingList) {
                        if (post.getPublisher().equals(id)) {
                            postLists.add(post);
                        }
                    }
                }

                postAdapter.notifyDataSetChanged();
                progressBar.setVisibility(View.GONE);
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });
    }
}

【问题讨论】:

  • 除了将任何Activity 设置移动到Fragment 时所做的正常更改之外,在Fragment 中执行此操作确实没有什么不同。你有什么问题吗?
  • @Mike M 我遇到了切换选项的问题,正如 vivek 在下面所说的那样。所以我只是在片段中植入了一个普通图标并为其设置和 onClick 选项,这似乎工作正常,但确实想要切换选项,并且 onBackPressed 似乎也不起作用。不知道您对这些观点是否有任何见解?
  • 好吧,我不确定您在使用 ActionBarDrawerToggle 时遇到了什么问题,因为您没有展示如何设置它。但是,它可以在Fragment 中正常工作。下面是一个小例子,证明了这一点:drive.google.com/file/d/17HMw4W_s_nOJIdyl8yGoQD4AVAvt8lFd/…。除此之外,我不确定您所说的“onBackPressed 似乎也不起作用”是什么意思。
  • @MikeM。想知道为什么drawerLayout可能会让我的工具栏弹跳吗?我按照上面 xml 文件中的描述做了所有事情,并且我 100 确定,当我从其他片段切换到主片段时,drawerLayout 负责使工具栏上下弹跳......关于为什么会这样的任何线索?跨度>
  • 我必须看到具体的行为才能开始猜测。你能把它记录下来,并在评论中链接到它吗? Emulator, Hardware.

标签: java android navigation-drawer toolbar


【解决方案1】:

这是不可能的。 因为要实现 Navigation Drawer 我们首先需要添加 android.support.v4.widget.DrawerLayout 作为 Activity 布局的根。 对于导航抽屉的切换选项,我们需要工具栏。

ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(this, drawerLayout, toolbar,
            R.string.navigation_drawer_open, R.string.navigation_drawer_close);
    drawerLayout.addDrawerListener(toggle);

工具栏在片段中是不可能的。 为了更好地使用,请在 DrawerLayout 内的 Activity 中制作 Navigation View。

【讨论】:

  • &lt;DrawerLayout&gt; 不必是Activity 的根布局。并且没有限制阻止在 Fragment 中使用 Toolbar。
  • @Mike M. 你能给我它的任何参考代码或它的任何例子吗?
  • @VivekModi 好吧伙计,是的,你是绝对正确的,切换选项不适用于打开抽屉,onBackPressed 也不起作用,但我的 HomeFragment 中有一个工具栏您可以在 xml 文件中看到...您建议我创建一个单独的活动以扩展到所有片段?也许有一种方法可以做到这一点,但禁用我不想使用的其他片段的 navigationDrawer?
  • 我错过了您对我发表评论的通知,但如果您仍然感兴趣,我在对该问题的评论中发布了一个简单示例的链接。
  • @MikeM。好的,非常感谢,我现在正在查看它并试图弄清楚它!谢谢大佬!!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多