Android 在活动开始时将片段加载到FrameLayout中

Android 在活动开始时将片段加载到FrameLayout中,android,android-studio,android-layout,android-fragments,Android,Android Studio,Android Layout,Android Fragments,我使用一个主要活动和一个用于显示片段的FrameLayout: 我的问题是,因为我使用的是FrameLayout而不是Fragment,所以Fragment不会自动加载到我的FrameLayout中。是的,我可以简单地将片段添加到onCreate中的布局中,但问题是每次方向更改时都会加载该片段,从而替换当前片段(使用我在onCreate中指定的片段) 变化片段 mainWindowFragment = new Login(); MainWindowFragmentChange("LoginVi

我使用一个主要活动和一个用于显示片段的FrameLayout:

我的问题是,因为我使用的是FrameLayout而不是Fragment,所以Fragment不会自动加载到我的FrameLayout中。是的,我可以简单地将片段添加到onCreate中的布局中,但问题是每次方向更改时都会加载该片段,从而替换当前片段(使用我在onCreate中指定的片段)

变化片段

mainWindowFragment = new Login();
MainWindowFragmentChange("LoginView");
MainWindowFragmentChange函数

private void MainWindowFragmentChange(String fragmentTag)
{
    mainWindowFragmentManager = getSupportFragmentManager();
    mainWindowFragmentTransaction = mainWindowFragmentManager.beginTransaction();
    mainWindowFragmentTransaction.setCustomAnimations(R.animator.slide_in_right, R.animator.slide_out_left);
    mainWindowFragmentTransaction.addToBackStack(fragmentTag);
    mainWindowFragmentTransaction.replace(R.id.mainActivityFragment, mainWindowFragment, fragmentTag);
    mainWindowFragmentTransaction.commit();
}
我的活动\u main\u window.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:background="#ffffff"
tools:context=".MainWindow"
android:fitsSystemWindows="true">

<include
    android:id="@+id/app_bar"
    layout="@layout/app_bar" />

<android.support.v4.widget.DrawerLayout
    android:id="@+id/nav_drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_below="@+id/app_bar">

    <LinearLayout
        android:layout_height="wrap_content"
        android:layout_width="match_parent"
        android:orientation="vertical">
        <!--<TextView
            android:id="@+id/countOfFragments"
            android:layout_height="wrap_content"
            android:layout_width="match_parent"
            android:text="Fragments count in back stack: 0"/>-->

        <FrameLayout
            android:name="com.schwabe.vossloh.linahome.GroupView"
            android:id="@+id/mainActivityFragment"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
    </LinearLayout>

    <android.support.design.widget.NavigationView
        android:id="@+id/nav_drawer"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:fitsSystemWindows="true"
        app:menu="@menu/nav_drawer_items"
        app:headerLayout="@layout/nav_drawer_header"/>
</android.support.v4.widget.DrawerLayout>
</RelativeLayout>

MainWindow.java

public class MainWindow extends AppCompatActivity {

private ImageView btn_Menu;
private ImageView btn_addLight;
private AnimatedVectorDrawableCompat menuToArrow;
private AnimatedVectorDrawableCompat arrowToMenu;

private boolean isShowingNavDraver = false;

private DrawerLayout navDrawerLayout;

private Fragment mainWindowFragment;
private FragmentManager mainWindowFragmentManager;
private FragmentTransaction mainWindowFragmentTransaction;

private TextView countOfFragments;

@Override
protected void onStart() {
    super.onStart();
    navDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
}

@Override
public void onBackPressed() {
    if(this.navDrawerLayout.isDrawerVisible(GravityCompat.START))
    {
        this.navDrawerLayout.closeDrawer(GravityCompat.START);
        btn_Menu.setImageDrawable(arrowToMenu);
        arrowToMenu.start();
        isShowingNavDraver = !isShowingNavDraver;
    }
    else
    {
        super.onBackPressed();
        System.exit(0);
    }
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main_window);

    AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);

    mainWindowFragmentManager = getSupportFragmentManager();
    btn_Menu = findViewById(R.id.btn_menu);
    navDrawerLayout = findViewById(R.id.nav_drawer_layout);

    menuToArrow = AnimatedVectorDrawableCompat.create(this, R.drawable.animation_menu_to_arrow);
    arrowToMenu = AnimatedVectorDrawableCompat.create(this, R.drawable.animation_arrow_to_menu);
    btn_Menu.setImageDrawable(menuToArrow);

    btn_Menu.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v)
        {                
            if(!isShowingNavDraver && !isFragmentActive("QRreader"))
            {
                btn_Menu.setImageDrawable(menuToArrow);
                menuToArrow.start();
                navDrawerLayout.openDrawer(Gravity.LEFT);
                isShowingNavDraver = !isShowingNavDraver;
            }
            else if(isShowingNavDraver && !isFragmentActive("QRreader"))
            {
                btn_Menu.setImageDrawable(arrowToMenu);
                arrowToMenu.start();
                navDrawerLayout.closeDrawers();
                isShowingNavDraver = !isShowingNavDraver;
            }
            else if(isFragmentActive("QRreader"))
            {
                btn_Menu.setImageDrawable(arrowToMenu);
                arrowToMenu.start();
                mainWindowFragmentManager.popBackStack();
            }
        }
    });

    final NavigationView navDrawerView = findViewById(R.id.nav_drawer);
    navDrawerView.setNavigationItemSelectedListener(
            new NavigationView.OnNavigationItemSelectedListener() {
                @Override
                public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {                      
                    switch (menuItem.getItemId())
                    {
                        case R.id.group_view_menuitem:
                            mainWindowFragment = new GroupView();
                            MainWindowFragmentChange(menuItem, "GroupView");
                            break;
                        case R.id.list_view_menuitem:
                            mainWindowFragment = new ListView();
                            MainWindowFragmentChange(menuItem, "ListView");
                            break;
                        case R.id.login_menuitem:
                            mainWindowFragment = new Login();
                            MainWindowFragmentChange(menuItem, "LoginView");
                            break;
                    }
                    isShowingNavDraver = !isShowingNavDraver;
                    return true;
                }
            }
    );

    btn_addLight = findViewById(R.id.btn_add_light);
    btn_addLight.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            if(isFragmentActive("GroupView") || isFragmentActive("ListView")) {
                btn_Menu.setImageDrawable(menuToArrow);
                menuToArrow.start();
                mainWindowFragment = new QRreader();
                MainWindowFragmentRightToLeft("QRreader");
            }
        }
    });
}

private void MainWindowFragmentChange(MenuItem menuItem, String fragmentTag)
{
    mainWindowFragmentManager = getSupportFragmentManager();
    cleanBackStack();
    mainWindowFragmentTransaction = mainWindowFragmentManager.beginTransaction();
    mainWindowFragmentTransaction.addToBackStack(fragmentTag);
    mainWindowFragmentTransaction.replace(R.id.mainActivityFragment, mainWindowFragment, fragmentTag);
    mainWindowFragmentTransaction.commit();
    menuItem.setChecked(true);

    btn_Menu.setImageDrawable(arrowToMenu);
    arrowToMenu.start();

    navDrawerLayout.closeDrawers();
}


private void MainWindowFragmentChange(String fragmentTag)
{
    mainWindowFragmentManager = getSupportFragmentManager();
    mainWindowFragmentTransaction = mainWindowFragmentManager.beginTransaction();
    mainWindowFragmentTransaction.addToBackStack(fragmentTag);
    mainWindowFragmentTransaction.replace(R.id.mainActivityFragment, mainWindowFragment, fragmentTag);
    mainWindowFragmentTransaction.commit();
}

private void MainWindowFragmentRightToLeft(String fragmentTag)
{
    mainWindowFragmentManager = getSupportFragmentManager();
    mainWindowFragmentTransaction = mainWindowFragmentManager.beginTransaction();
    mainWindowFragmentTransaction.setCustomAnimations(R.animator.slide_in_right, R.animator.slide_out_left);
    mainWindowFragmentTransaction.addToBackStack(fragmentTag);
    mainWindowFragmentTransaction.replace(R.id.mainActivityFragment, mainWindowFragment, fragmentTag);
    mainWindowFragmentTransaction.commit();
}

private boolean isFragmentActive(String nameOfFragment)
{
    Fragment fragment = getSupportFragmentManager().findFragmentByTag(nameOfFragment);
    return fragment != null;
}


private void cleanBackStack()
{
    for(int i = 0; i < mainWindowFragmentManager.getBackStackEntryCount(); ++i)
        mainWindowFragmentManager.popBackStack();
}
public类主窗口扩展AppCompative活动{
私有图像查看btn_菜单;
私有图像视图btn_addLight;
私有动画矢量绘图兼容菜单箭头;
私有动画矢量绘图兼容箭头菜单;
私有布尔值isShowingNavDraver=false;
私人抽屉布局导航抽屉布局;
私有片段;
私有碎片管理器主窗口碎片管理器;
私有碎片事务mainWindowFragmentTransaction;
私有文本视图countOfFragments;
@凌驾
受保护的void onStart(){
super.onStart();
navDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK\u MODE\u LOCKED\u CLOSED);
}
@凌驾
public void onBackPressed(){
if(this.navDrawerLayout.isDrawervible(GravityCompat.START))
{
this.navDrawerLayout.closeDrawer(GravityCompat.START);
btn_菜单。可设置图像绘制(箭头至菜单);
arrowToMenu.start();
isShowingNavDraver=!isShowingNavDraver;
}
其他的
{
super.onBackPressed();
系统出口(0);
}
}
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u主窗口);
AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
mainWindowFragmentManager=getSupportFragmentManager();
btn_菜单=findViewById(R.id.btn_菜单);
导航抽屉布局=findViewById(R.id.nav_抽屉布局);
menuToArrow=AnimatedVectorDrawableCompat.create(这是R.drawable.animation菜单到箭头);
arrowToMenu=AnimatedVectorDrawableCompat.create(这是R.drawable.animation\u arrow\u to\u菜单);
btn_菜单。可设置图像绘制(菜单箭头);
btn_Menu.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v)
{                
如果(!isShowingNavDraver&!isFragmentActive(“QRreader”))
{
btn_菜单。可设置图像绘制(菜单箭头);
menuToArrow.start();
navDrawerLayout.openDrawer(重力,左);
isShowingNavDraver=!isShowingNavDraver;
}
否则如果(isShowingNavDraver&!isFragmentActive(“QRreader”))
{
btn_菜单。可设置图像绘制(箭头至菜单);
arrowToMenu.start();
navDrawerLayout.closeDrawers();
isShowingNavDraver=!isShowingNavDraver;
}
else if(isFragmentActive(“QRreader”))
{
btn_菜单。可设置图像绘制(箭头至菜单);
arrowToMenu.start();
mainWindowFragmentManager.popBackStack();
}
}
});
最终导航视图navDrawerView=findViewById(R.id.nav_抽屉);
navDrawerView.setNavigationItemSelectedListener(
新建NavigationView.OnNavigationItemSelectedListener(){
@凌驾
公共布尔值onNavigationItemSelected(@NonNull MenuItem MenuItem){
开关(menuItem.getItemId())
{
案例R.id.组\视图\菜单项:
mainWindowFragment=新的组视图();
MainWindowFragmentChange(菜单项,“组视图”);
打破
案例R.id.列表\视图\菜单项:
mainWindowFragment=新建ListView();
MainWindowFragmentChange(菜单项,“列表视图”);
打破
案例R.id.login\u菜单项:
mainWindowFragment=新登录名();
MainWindowFragmentChange(菜单项,“登录视图”);
打破
}
isShowingNavDraver=!isShowingNavDraver;
返回true;
}
}
);
btn_addLight=findviewbyd(R.id.btn_add_light);
btn_addLight.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
如果(isFragmentActive(“GroupView”)| isFragmentActive(“ListView”)){
btn_菜单。可设置图像绘制(菜单箭头);
menuToArrow.start();
mainWindowFragment=新的QRreader();
MainWindowFragmentRightToLeft(“QRreader”);
}
}
});
}
private void MainWindowFragmentChange(MenuItem MenuItem,字符串fragmentTag)
{
mainWindowFragmentManager=getSupportFragmentManager();
cleanback();
mainWindowFragmentTransaction=mainWindowFragmentManager.beginTransaction();
mainWindowFragmentTransaction.addToBackStack(fragmentTag);
mainWindowFragmentTransaction.replace(R.id.mainActivityFragment,mainWindowFragment,fragmentTag);
mainWindowFragmentTransaction.commit();
menuItem.setChecked(true);
btn_菜单。可设置图像绘制(箭头至菜单);
arrowToMenu.start();
navDrawerLayout.closeDrawers();
}
private void MainWindowFragmentChange(字符串fragmentTag)
{
mainWindowFragmentManager=getSupportFragmentManager();
mainWindowFragmentTransaction=mainWindowFragmentManager.beginTransaction();
mainWindowFragmentTransaction.addToBackStack(fragmentTag);
mainWindowFragmentTransaction.replace(R.id.mainActivityFragment,mainWindowFragment,fragmentTag);
主窗口片段事务
protected void onCreate(Bundle savedInstanceState){
    if(savedInstanceState == null) { 
        // add/replace your fragment as you would do the first time
    } else {
        // activity is recreated due to any configuration change . here the fragment will be automatically attached by the fragment manager. You can fetch that fragment by findFragmentByTag(String tag) and then use it.
    }
}