当前位置: 首页 > 知识库问答 >
问题:

导航抽屉片段甚至与replace()重叠

卢书
2023-03-14

我在活动中有一个导航抽屉。活动的布局具有片段的相对布局。relativelayout的id是mainContent,我在活动的onCreate()中加载片段(称为fragA)。我在导航抽屉里还有同样的片段和其他导航项目。它在创建活动时加载,也可以从导航抽屉加载。

在选择导航项时,我将main Content中的片段(活动中的相对布局)替换为替换()。在抽屉菜单中,第0项是“片段B”(与片段A相同,但在导航抽屉中)。其次是另一个片段(片段C)。当我选择片段B“不止一次”,然后选择片段A并按下返回按钮时,片段B和片段C重叠。

我还必须一直按后退按钮才能进入初始屏幕,因为每次我从导航抽屉中选择一个项目时,都会创建新的碎片FRAGB和FRAGC。未更换。我在活动布局的主内容(第一个相对布局)中替换它们。我使用的是片段的框架布局。

这是我放置片段的活动布局:

<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/drawerLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.prematixsofs.taxiapp.DateVehiclePicker">
<!-- The main content view -->

<RelativeLayout
    android:id="@+id/mainContent"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <include
        layout="@layout/footer"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:layout_gravity="center_horizontal|bottom"></include>
</RelativeLayout>

<!-- The navigation drawer -->
<RelativeLayout
    android:id="@+id/drawerPane"
    android:layout_width="230dp"
    android:layout_height="match_parent"

    android:layout_gravity="start">

    <!-- Profile Box -->

    <RelativeLayout
        android:id="@+id/profileBox"
        android:layout_width="match_parent"
        android:layout_height="80dp"
        android:background="#ff02c7c4"
        android:padding="8dp">

        <ImageView
            android:id="@+id/avatar"
            android:layout_width="50dp"
            android:layout_height="50dp"
            android:layout_marginTop="15dp"
            android:src="@drawable/user" />

        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="42dp"
            android:layout_centerVertical="true"
            android:layout_marginLeft="15dp"
            android:layout_toRightOf="@+id/avatar"
            android:orientation="vertical">

            <TextView
                android:id="@+id/userName"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:clickable="true"
                android:textColor="#fff"
                android:textSize="16sp"
                android:textStyle="bold" />

            <TextView
                android:id="@+id/viewProfile"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="bottom"
                android:layout_marginTop="4dp"
                android:text="View Profile"
                android:textColor="#fff"
                android:textSize="12sp" />
        </LinearLayout>
    </RelativeLayout>

    <!-- List of Actions (pages) -->
    <ListView
        android:id="@+id/navList"
        android:layout_width="280dp"
        android:layout_height="match_parent"
        android:layout_below="@+id/profileBox"
        android:background="#ffffffff"
        android:choiceMode="singleChoice" />

    <TextView
        android:id="@+id/invisibleTextViewId"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:visibility="gone" />
</RelativeLayout>

这是我加载片段A的活动代码:

 android.support.v4.app.FragmentManager fragmentManager = getSupportFragmentManager();
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    fragmentTransaction.add(R.id.mainContent, new DateTimePicker(),"tags").commit();

这是导航抽屉onSelect:

  private void selectItemFromDrawer(int position) {
    Fragment fragment = null;

    switch (position){
        case 0: fragment = new DateTimePicker();
            break;
        case 1: fragment = new PreferencesFragment();
            break;
        case 2:
            mDrawerLayout.closeDrawer(mDrawerPane);
            AlertDialog.Builder alertDialog = new AlertDialog.Builder(DateVehiclePicker.this);

            alertDialog.setTitle("Logout");

            // Setting Dialog Message
            alertDialog.setMessage("Do you want to Logout?");
            alertDialog.setPositiveButton("YES", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {
                    sessionManager.logoutUser();
                }
            });

            alertDialog.setNegativeButton("NO", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {
                    Intent intent = new Intent(getApplicationContext(), MainActivity.class);
                    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                    intent.putExtra("EXIT", true);
                    startActivity(intent);
                    dialog.cancel();
                }
            });

            alertDialog.show();
    }
    if(fragment!=null)
    {
        FragmentManager fragmentManager = getSupportFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        fragmentTransaction.addToBackStack(null).replace(R.id.mainContent, fragment);
        fragmentTransaction.commit();
        mDrawerLayout.closeDrawer(mDrawerPane);
    }

这是我为nav抽屉设置侦听器的地方:

 mDrawerList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            selectItemFromDrawer(position);

        }
    });

我调用方法selectItemFromDrawer(position)

共有3个答案

翟俊哲
2023-03-14

尝试将R.id.mainContent更改为R.id.container。我有类似的设置,但它与R.id.container一起工作很好。

fragmentManager.beginTransaction().replace(R.id.container,
                new Registration_fragment()).commit();

在加载期间,您最初也必须更换FragA(而不是add)。

fragmentTransaction.replace(R.id.mainContent, new DateTimePicker(),"tags").commit();
东郭俊楠
2023-03-14

问题是,每次尝试更改片段时,您都在为片段事务创建新对象。使其在代码中全局化,并在任何地方使用相同的实例。这是带有switch case而不是if else的代码

 private void displayView(int position) {
            Fragment fragment = null;
            String title = getString(R.string.app_name);
            switch (position) {
                case 0:
                  fragment=new FragmentHome();
                    title="Home";
                    break;
                case 1:
                   fragment=new FragmentAddress();
                    title="Update Address";
                    break;
                case 2:
                    fragment=new FragmentHelpList();
                    title="My Helps";
                    break;
                case 3:
                    fragment=new FragmentCompletedHelps();
                    title="History";
                    break;
                case 4:
                    fragment=new FragmentSupport();
                    title="Account & Support";
                    break;
                case 5:
                    fragment=new FragmentAbout();
                    title="About";
                    break;
                case 6:
                        appSharedPreferences.setSession(false);
                    finish();
                    break;
                default:
                    break;
            }

            if (fragment != null) {
                FragmentManager fragmentManager = getSupportFragmentManager();
                FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
                fragmentTransaction.replace(R.id.container_body, fragment);
                fragmentTransaction.commit();
                // set the toolbar title
                getSupportActionBar().setTitle(title);
            }

将片段变量也设为全局变量

燕琛
2023-03-14

为此,您必须处理backbackback。当您添加主片段或用主片段替换时,您必须清除堆栈上的所有片段

 @Override
    public void onBackPressed() {
        Logg.e(TAG, getFragmentManager().getBackStackEntryCount());
        try {
            if (mNavigationDrawerFragment.isDrawerOpen())
            {
                mNavigationDrawerFragment.closeDrawer();
            }

            if (getFragmentManager().getBackStackEntryCount() > 1) {
                getFragmentManager().popBackStack();
            } else
            {   Exit();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
 类似资料:
  • 我目前正在为我的Android应用程序使用导航抽屉。在我的第一个片段中,有一个片段使用Facebook的Graph API加载数据。因此,当我的应用程序第一次加载时,它首先进入第一个片段。 然后,我使用导航抽屉单击另一个片段并查看它。 最后,我重用导航抽屉返回第一个片段并查看它。 我面临的问题是,我如何继续利用已经创建过一次的片段,而不是在选择导航抽屉项时重新创建它。我的片段切换代码如下所示。 我

  • 在阅读了关于片段和活动的文档和讨论后,我想我已经把情况弄清楚了。 活动应该为用户提供一个屏幕,用户可以在其中工作。导航到其他屏幕通常会破坏活动。 片段应该提供很少或单个功能组件,可以在活动中再次使用。片段的内容应该相互独立地工作,因此可以在多个活动中重用。 虽然这一切似乎都有道理,但有一件事我无法理解: 如果您创建一个新的Android应用程序,并选择创建Android导航抽屉应用程序的选项,为什

  • 我已经在我的项目中添加了一个导航抽屉活动,并尝试将项目作为片段添加。这就是我在主要活动中所做的。 默认片段是Home,它工作正常,正如预期的那样,但其他片段与Home片段重叠。(HomeFragment是唯一工作正常的)。我在每个片段类中都做过这样的事情: 我看不出错误在哪里。一切看起来都很好,但所有其他片段都显示在HomeFragment上。

  • 我希望能够使用导航抽屉,并根据导航中的选择在不同片段之间进行更改。 我正在使用Android Studio,基本上我所做的是这样的: 使用内置模板“导航抽屉活动”创建了一个新项目 创建了一个空白片段 然后我更改了onNavigationDrawerItemSelected方法中的一些代码。 我的程序崩溃了,给了我很多我不理解的错误。我做错了什么?

  • 我是一名iOS开发者,我开始尝试将我的一个应用程序移植到Android。一切都很顺利,直到我遇到了一个问题,这让我在过去几天里步履维艰。 我的应用程序使用的是导航抽屉模板,工作正常。通过点击所需的导航项,我可以很容易地在片段之间切换。然而,问题是当我试图从现有片段中切换内容时。换句话说,我的一个片段上有一个按钮,单击时,我希望它用另一个片段替换内容。我已经使用以下代码实现了这一点: 当此代码切换到

  • 我有一个主活动启动导航抽屉。 也有一些片段。 我需要从片段内部更改导航抽屉列表的标题。 我尝试了这个内部片段: 但是到目前为止还没有运气。这是我的主要活动: 在主活动类中使用相同的方法有效,但在片段中无效。我不知道如何更新字符串并通知抽屉此更改!