【问题标题】:How to replace framelayout with fragment programmatically如何以编程方式用片段替换框架布局
【发布时间】:2020-02-22 20:27:30
【问题描述】:

当在活动中单击按钮时,我试图用片段替换带有 id 容器的框架布局。我认为我编写的代码正在运行,但有些地方不对,可能是布局问题。当应用程序运行时,片段会出现一秒钟,然后立即消失,有东西挡住了它。可能是 framelayout 与 viewpager 有问题。我在这里做错了什么?

这是我的 xml。

<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/drawer"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#000">

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

        <include
            android:id="@+id/toolbar_actionbar"
            layout="@layout/toolbar_default"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:visibility="gone"/>

        <FrameLayout
            android:id="@+id/container"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_below="@+id/toolbar_actionbar"
            android:clickable="true" />

        <android.support.v4.view.ViewPager
            android:id="@+id/pager"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />

        <TextView
            android:layout_below="@+id/toolbar_actionbar"
            android:paddingRight="30dp"
            android:textColor="#fff"
            android:layout_width="80dp"
            android:layout_height="80dp"
            android:text="Skip"
            android:textSize="20sp"
            android:gravity="right"
            android:id="@+id/txt_skip"
            android:layout_alignParentRight="true"
            android:layout_marginTop="20dp"
            />

        <com.viewpagerindicator.CirclePageIndicator
            android:id="@+id/indicator"
            android:layout_width="80dp"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:layout_centerHorizontal="true"
            android:gravity="bottom"
            app:centered="true"
            app:fillColor="@color/white"
            app:pageColor="@color/white"
            app:snap="false"
            android:paddingBottom="20dp"
            android:layout_margin="2dp"
            />


        <com.gc.materialdesign.views.ButtonRectangle
            android:id="@+id/sign_in_button"
            android:layout_width="90dp"
            android:layout_height="60dp"
            android:background="@color/primary_color"
            android:text="Sign in"
            android:paddingBottom="20dp"
            android:paddingRight="40dp"
            android:layout_alignParentBottom="true"
            android:layout_alignParentLeft="true"/>


        <com.gc.materialdesign.views.ButtonRectangle
            android:id="@+id/sign_up_button"
            android:layout_width="90dp"
            android:layout_height="60dp"
            android:background="@color/primary_color"
            android:text="Sign Up"
            android:paddingBottom="20dp"
            android:paddingLeft="40dp"
            android:layout_alignParentBottom="true"
            android:layout_alignParentRight="true"/>
    </RelativeLayout>


    <fragment
        android:visibility="gone"
        android:layout_width="280dp"
        android:layout_height="match_parent"
        android:id="@+id/fragment_drawer"
        android:layout_gravity="start"
        android:background="#ff0000"
        app:layout="@layout/fragment_navigation_drawer"
        android:name="com.app.foodmandu.view.nav.NavigationDrawerFragment"/>

</android.support.v4.widget.DrawerLayout>

当点击按钮时,该方法从活动中触发片段事务。

// inside onClick method.
 openFragment( SignupFragment.newInstance());


// This method gets invoked when a button is clicked.
 public void openFragment(Fragment fragment) {
    FragmentTransaction ft = getSupportFragmentManager()
            .beginTransaction();
    ft.replace(R.id.container,
            fragment);
    ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
    ft.addToBackStack(null);
    ft.commitAllowingStateLoss();
}

【问题讨论】:

  • 框架布局获得子视图的方式看起来不太乐观
  • @PankajNimgade 关于我应该怎么做才能让这个东西正常工作有什么建议吗?
  • 我相信你可能会遇到 ViewPager 和 Framelayout 之间的冲突,因为你可以同时拥有它们的片段,你可能会首先想到应用程序的设计流程
  • 您的片段的邮政编码,即 SignupFragment
  • @KapilRajput 我很确定与注册片段无关。代码正在运行,但视图存在冲突

标签: android android-framelayout fragmenttransaction


【解决方案1】:

您需要在活动 onCreate 方法上添加默认片段,如下所示:

getFragmentManager().beginTransaction().add(R.id.container, YOUR FRAGMENT).commit();

【讨论】:

    【解决方案2】:

    我认为您的 FrameLayout 隐藏在 ViewPager 下,并且 ViewPager 与 FrameLayout 重叠。试试这个:

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >
    
        <include
            android:id="@+id/toolbar_actionbar"
            layout="@layout/toolbar_default"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:visibility="gone"/>
    
    
    
        <android.support.v4.view.ViewPager
            android:id="@+id/pager"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
    
        <TextView
            android:layout_below="@+id/toolbar_actionbar"
            android:paddingRight="30dp"
            android:textColor="#fff"
            android:layout_width="80dp"
            android:layout_height="80dp"
            android:text="Skip"
            android:textSize="20sp"
            android:gravity="right"
            android:id="@+id/txt_skip"
            android:layout_alignParentRight="true"
            android:layout_marginTop="20dp"
            />
    
        <com.viewpagerindicator.CirclePageIndicator
            android:id="@+id/indicator"
            android:layout_width="80dp"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:layout_centerHorizontal="true"
            android:gravity="bottom"
            app:centered="true"
            app:fillColor="@color/white"
            app:pageColor="@color/white"
            app:snap="false"
            android:paddingBottom="20dp"
            android:layout_margin="2dp"
            />
    
    
        <com.gc.materialdesign.views.ButtonRectangle
            android:id="@+id/sign_in_button"
            android:layout_width="90dp"
            android:layout_height="60dp"
            android:background="@color/primary_color"
            android:text="Sign in"
            android:paddingBottom="20dp"
            android:paddingRight="40dp"
            android:layout_alignParentBottom="true"
            android:layout_alignParentLeft="true"/>
    
    
        <com.gc.materialdesign.views.ButtonRectangle
            android:id="@+id/sign_up_button"
            android:layout_width="90dp"
            android:layout_height="60dp"
            android:background="@color/primary_color"
            android:text="Sign Up"
            android:paddingBottom="20dp"
            android:paddingLeft="40dp"
            android:layout_alignParentBottom="true"
            android:layout_alignParentRight="true"/>
    
       <FrameLayout
            android:id="@+id/container"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_below="@+id/toolbar_actionbar"
            android:clickable="true" />
    
    </RelativeLayout>
    
    
    <fragment
        android:visibility="gone"
        android:layout_width="280dp"
        android:layout_height="match_parent"
        android:id="@+id/fragment_drawer"
        android:layout_gravity="start"
        android:background="#ff0000"
        app:layout="@layout/fragment_navigation_drawer"
        android:name="com.app.foodmandu.view.nav.NavigationDrawerFragment"/>
    

    通过将 FrameLayout 放在 RelativeLayout 中的最后,它会出现在所有内容之上,并与任何其他视图重叠。

    【讨论】:

    • 尝试了您的建议,但 viewpager 阻止了框架布局。
    猜你喜欢
    • 1970-01-01
    • 2012-04-24
    • 2013-12-25
    • 1970-01-01
    • 1970-01-01
    • 2014-07-02
    • 1970-01-01
    • 1970-01-01
    • 2013-08-20
    相关资源
    最近更新 更多