片段事务负载空白视图 [英] Fragment Transaction loads a blank view

查看:174
本文介绍了片段事务负载空白视图的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问题似乎是,似乎碎片在极少数情况下一个很奇怪的方式来加载。

有时一个片段的观点是不可见的,onCreateView被调用,但它确实认为不添加到活动中,它只是加载一个空白页。当onResume从恢复应用程序(比如去最近的应用,然后点击我的应用程序)呼吁出现的视图。

所有片段事务在主线程上显然做。

这发生在每20次约1。

我很乐意提供你想要的任何code。因此,如果缺少了什么,那么请让我知道,我会很乐意提供为你

我在我的活动的onCreate:

  @覆盖
    保护无效的onCreate(捆绑savedInstanceState){
        super.onCreate(savedInstanceState);        Variables.context =这一点;
        Variables.activity =这一点;
        Variables.p_class = HomeActivity.class;        的setContentView(R.layout.activity_main);        工具栏=(栏)findViewById(R.id.toolbar);
        setSupportActionBar(工具栏);
        抽屉=(DrawerLayout)findViewById(R.id.drawer_layout);
        ActionBarDrawerToggle切换=新ActionBarDrawerToggle(
                对此,抽屉,工具栏,R.string.navigation_drawer_open,R.string.navigation_drawer_close);
        drawer.setDrawerListener(切换);
        toggle.syncState();        如果(getSupportActionBar()!= NULL){
            getSupportActionBar()setDisplayHomeAsUpEnabled(假)。
        }        toolbar.setNavigationIcon(NULL);
        toolbar.getMenu()清()。        NavigationView navigationView =(NavigationView)findViewById(R.id.nav_view);
        navigationView.setNavigationItemSelectedListener(本);        actionbar_pw_spinner =(ProgressWheel)findViewById(R.id.actionbar_pw_spinner);
        actionbar_pw_mins =(的TextView)findViewById(R.id.actionbar_pw_mins);        actionBarTitleTV =(的TextView)findViewById(R.id.custom_actionbar_title);        usersName =(的TextView)findViewById(R.id.usersName);
        usersEmail =(的TextView)findViewById(R.id.usersEmail);        actionBarTitleTV.setText(this.getTitle());        btnBack =(ImageView的)findViewById(R.id.button_back);
        btnBack.setOnClickListener(新View.OnClickListener(){
            @覆盖
            公共无效的onClick(视图v){
                onBack pressed();
            }
        });
        btnBack.setVisibility(View.GONE);        btnMenu =(ImageView的)findViewById(R.id.button_menu);
        btnMenu.setOnClickListener(新View.OnClickListener(){
            @覆盖
            公共无效的onClick(视图v){
                openDrawer();
            }
        });
        btnMenu.setVisibility(View.GONE);        setPersonInfo();        Fabric.with(这一点,新Crashlytics());        Variables.myLocation =新的位置(myLoc);
        Variables.myLocation.setLatitude(0.0);
        Variables.myLocation.setLongitude(0.0);        如果(!Variables.isThisBidTaxi()){
            CustomerComms.myOwnSocket =新MySocket(NULL);
            CustomerComms.myOwnSocket.start();
        }        SettingSQLHelper帮手=新SettingSQLHelper(HomeActivity.this);
        Variables.setting = helper.getSetting();
        helper.close();        mRequestingLocationUpdates = FALSE;        buildGoogleApiClient();
        createLocationRequest();
        buildLocationSettingsRequest();
        checkLocationSettings();        的setTitle();        如果(savedInstanceState!= NULL){
            返回;
        }其他{
            。getSupportFragmentManager()调用BeginTransaction()加(R.id.fragmentspace,新SplashFragment())commitAllowingStateLoss()。
            ((HomeActivity)Variables.context).getSupportFragmentManager()executePendingTransactions()。
        }        containLayout = NULL;
        containLayout =(的FrameLayout)findViewById(R.id.fragmentspace);        。getSupportFragmentManager()addOnBackStackChangedListener(getListener());
        m_updateBooking =(预订)getIntent()getSerializableExtra(预订);        m_TrackDriver =(布尔)getIntent()getSerializableExtra(跟踪)。        Variables.initBooking();
    }

我在我的活动onResume:

 保护无效onResume(){
        super.onResume();        如果(mGoogleApiClient.isConnected()及&放大器; mRequestingLocationUpdates){
            startLocationUpdates();
        }        Variables.context =这一点;
        Variables.activity =这一点;        如果(m_updateBooking!= NULL){            如果(m_updateBooking.getJobStatus()== Booking.eeJob_Complete){
                如果(!Variables.driverrated){
                    DriverRatingFragment DriverRatingFRA = DriverRatingFragment.newInstance(m_updateBooking);
                    。getSupportFragmentManager()调用BeginTransaction()加(R.id.fragmentspace,DriverRatingFRA).addToBackStack(DriverRatingFragment.class.getName())commitAllowingStateLoss()。
                    ((HomeActivity)Variables.context).getSupportFragmentManager()executePendingTransactions()。                }
            }其他{
                如果(m_TrackDriver){
                    getSupportFragmentManager()调用BeginTransaction()。添加(R.id.fragmentspace, TrackingDriverFragment.newInstance(m_updateBooking)).addToBackStack(TrackingDriverFragment.class.getName()).commitAllowingStateLoss();
                    ((HomeActivity)Variables.context).getSupportFragmentManager()executePendingTransactions()。                }其他{
                    gotoMyBooking(m_updateBooking);
                }
            }
        }        m_updateBooking = NULL;
        。getIntent()removeExtra(预订);
        。getIntent()removeExtra(跟踪);        如果(Variables.setting == NULL){
            最后SettingSQLHelper帮手=新SettingSQLHelper(HomeActivity.this);
            Variables.setting = helper.getSetting();
        }    }

我的onPause

  @覆盖
    保护无效的onPause(){
        super.onPause();
        如果(mGoogleApiClient.isConnected()){
            stopLocationUpdates();
        }
    }我的一个片段里面onCreateView看起来是这样的:        @覆盖
        公共查看onCreateView(LayoutInflater充气器,容器的ViewGroup,捆绑savedInstanceState){
           inflatedView = inflater.inflate(R.layout.fragment_new_booking,集装箱,FALSE); //我的code的其余部分则如下这里
    返回inflaterview
        }

我的活动XML文件看起来像这样:

 <?XML版本=1.0编码=UTF-8&GT?;
< android.support.v4.widget.DrawerLayout的xmlns:机器人=htt​​p://schemas.android.com/apk/res/android
    的xmlns:ProgressWheel =htt​​p://schemas.android.com/apk/res-auto
    的xmlns:程序=htt​​p://schemas.android.com/apk/res-auto
    的xmlns:工具=htt​​p://schemas.android.com/tool​​s
    机器人:ID =@ + ID / drawer_layout
    机器人:layout_width =match_parent
    机器人:layout_height =match_parent
    机器人:fitsSystemWindows =真
    工具:openDrawer =开始>    < android.support.design.widget.CoordinatorLayout
        机器人:layout_width =match_parent
        机器人:layout_height =match_parent
        机器人:fitsSystemWindows =真
        工具:上下文=。Activity.HomeActivity>        < android.support.design.widget.AppBarLayout
            机器人:layout_width =match_parent
            机器人:layout_height =WRAP_CONTENT
            机器人:主题=@风格/ AppTheme.AppBarOverlay>            < android.support.v7.widget.Toolbar
                机器人:ID =@ + ID /工具栏
                机器人:layout_width =match_parent
                机器人:layout_height =?ATTR / actionBarSize
                机器人:ATTR / colorPrimary背景=
                应用:popupTheme =@风格/ AppTheme.PopupOverlay>                <的FrameLayout
                    机器人:layout_width =match_parent
                    机器人:layout_height =WRAP_CONTENT
                    机器人:layout_centerVertical =真正的>                    <的TextView
                        机器人:ID =@ + ID / custom_actionbar_title
                        机器人:layout_width =FILL_PARENT
                        机器人:layout_height =WRAP_CONTENT
                        机器人:layout_gravity =中心
                        机器人:比重=中心
                        机器人:单线=真
                        机器人:文字=@字符串/ new_booking
                        机器人:文字颜色=@色/白
                        机器人:TEXTSIZE =18sp/>                    <的FrameLayout
                        机器人:layout_width =WRAP_CONTENT
                        机器人:layout_height =WRAP_CONTENT
                        机器人:layout_gravity =center_vertical>                        < ImageView的
                            机器人:ID =@ + ID / button_back
                            机器人:layout_width =30dp
                            机器人:layout_height =30dp
                            机器人:layout_gravity =center_vertical |启动
                            机器人:contentDescription =@字符串/ back_button
                            机器人:fitsSystemWindows =真
                            机器人:SRC =@绘制/ ic_arrow_back_white_24dp/>                        < ImageView的
                            机器人:ID =@ + ID / button_menu
                            机器人:layout_width =30dp
                            机器人:layout_height =30dp
                            机器人:layout_gravity =center_vertical |启动
                            机器人:contentDescription =@字符串/ menu_button
                            机器人:fitsSystemWindows =真
                            机器人:SRC =@绘制/ ic_menu_white_24dp/>
                    < /&的FrameLayout GT;                    < com.todddavies.components.progressbar.ProgressWheel
                        机器人:ID =@ + ID / actionbar_pw_spinner
                        机器人:layout_width =30dp
                        机器人:layout_height =30dp
                        机器人:layout_gravity =顶|结束
                        机器人:layout_marginRight =10dp
                        机器人:知名度=水涨船高
                        ProgressWheel:barColor =#86f066
                        ProgressWheel:barLength =10dp
                        ProgressWheel:barWidth =1DP
                        ProgressWheel:rimColor =@色/白
                        ProgressWheel:rimWidth =2DP
                        ProgressWheel:文字颜色=@色/白
                        ProgressWheel:TEXTSIZE =15sp/>                    <的TextView
                        机器人:ID =@ + ID / actionbar_pw_mins
                        机器人:layout_width =WRAP_CONTENT
                        机器人:layout_height =WRAP_CONTENT
                        机器人:layout_gravity =右
                        机器人:layout_marginRight =15dp
                        机器人:layout_marginTop =27dp
                        机器人:文字=@字符串/分钟
                        机器人:文字颜色=@色/白
                        机器人:TEXTSIZE =10SP
                        机器人:知名度=水涨船高/>                < /&的FrameLayout GT;            < /android.support.v7.widget.Toolbar>        < /android.support.design.widget.AppBarLayout>        <的FrameLayout
            机器人:ID =@ + ID / fragmentspace
            机器人:layout_width =match_parent
            机器人:layout_height =match_parent
            机器人:背景=@色/白/>    < /android.support.design.widget.CoordinatorLayout>    < android.support.design.widget.NavigationView
        机器人:ID =@ + ID / nav_view
        机器人:layout_width =WRAP_CONTENT
        机器人:layout_height =match_parent
        机器人:layout_gravity =开始
        机器人:fitsSystemWindows =真
        应用:headerLayout =@布局/ nav_header_main
        应用:菜单=@菜单/ activity_main_drawer/>< /android.support.v4.widget.DrawerLayout>

我的Andr​​oid清单如下:

 <?XML版本=1.0编码=UTF-8&GT?;
<清单的xmlns:机器人=htt​​p://schemas.android.com/apk/res/android
    包=com.commandsoftware.androidbookingapp
    安卓的installLocation =自动>    <使用许可权的android:NAME =com.chasesoftware.cabmaster.permission.MAPS_RECEIVE/>
    <使用许可权的android:NAME =android.permission.INTERNET对/>
    <使用许可权的android:NAME =android.permission.WRITE_EXTERNAL_STORAG​​E/>
    <使用许可权的android:NAME =com.google.android.providers.gsf.permission.READ_GSERVICES/>
    <使用许可权的android:NAME =android.permission.ACCESS_COARSE_LOCATION/>
    <使用许可权的android:NAME =android.permission.ACCESS_NETWORK_STATE/>
    <使用许可权的android:NAME =android.permission.ACCESS_FINE_LOCATION/>
    <使用许可权的android:NAME =android.permission.READ_PHONE_STATE/>
    <使用许可权的android:NAME =android.permission.RECEIVE_SMS/>
    <使用许可权的android:NAME =android.permission.VIBRATE/>
    <使用许可权的android:NAME =android.permission.CALL_PHONE/>
    <使用许可权的android:NAME =android.permission.GET_ACCOUNTS/>
    <使用许可权的android:NAME =android.permission.READ_CONTACTS/>
    <使用许可权的android:NAME =android.permission.READ_PROFILE/>
    <使用许可权的android:NAME =android.permission.USE_CREDENTIALS/>    <应用
        机器人:图标=@绘制/ ic_launcher
        机器人:标签=@字符串/ APP_NAME
        机器人:supportsRtl =真
        机器人:主题=@风格/ AppTheme>>
        <活动
            机器人:名字=。Activity.HomeActivity
            机器人:标签=@字符串/ APP_NAME
            机器人:noHistory =假
            机器人:screenOrientation =肖像>
            &所述;意图滤光器>
                <作用机器人:名字=android.intent.action.MAIN/>
                <类机器人:名字=android.intent.category.LAUNCHER/>
            &所述; /意图滤光器>
        < /活性GT;        &所述;元数据
            机器人:名字=com.google.android.gms.version
            机器人:值=@整数/ GOOGLE_PLAY_SERVICES_VERSION/>
        &所述;元数据
            机器人:名字=com.google.android.maps.v2.API_KEY
            机器人:值=@字符串/ google_api/>        <接收机器人:名字=。Activity.SMSReceiver>
            &所述;意图滤光器>
                <作用机器人:名字=android.provider.Telephony.SMS_RECEIVED/>
            &所述; /意图滤光器>
        < /接收器>        &所述;元数据
            机器人:名字=io.fabric.ApiKey
            机器人:值=@字符串/ fabric_key/>        &所述;元数据
            机器人:名字=com.facebook.sdk.ApplicationId
            机器人:值=@字符串/ facebook_app_id/>        <供应商
            机器人:名字=com.facebook.FacebookContentProvider
            机器人:当局=@字符串/ facebook_api
            机器人:出口=FALSE/>        <活动
            机器人:名字=com.facebook.FacebookActivity
            机器人:configChanges =键盘| keyboardHidden |屏幕布置|屏幕尺寸|定位
            机器人:标签=@字符串/ APP_NAME
            机器人:主题=@安卓风格/ Theme.Translucent.NoTitleBar/>    < /用途>< /清单>

当我提交一个片段交易我的code是这样的:

 ((HomeActivity)Variables.context).getSupportFragmentManager()调用BeginTransaction()。删除(((HomeActivity) Variables.context).getSupportFragmentManager().findFragmentById(R.id.fragmentspace)).commitAllowingStateLoss();
            ((HomeActivity)Variables.context).getSupportFragmentManager()executePendingTransactions()。
            ((HomeActivity)Variables.context).getSupportFragmentManager()调用BeginTransaction()。添加(R.id.fragmentspace,新MyBidsFragment().newInstance(booking)).addToBackStack(MyBidsFragment.class.getName()).commitAllowingStateLoss();
            ((HomeActivity)Variables.context).getSupportFragmentManager()executePendingTransactions()。

片段交易的另一个例子

  myBookingsFragment = MyBookingsFragment.newInstance(updateBooking);
        getSupportFragmentManager()调用BeginTransaction()。添加(R.id.fragmentspace, myBookingsFragment).addToBackStack(myBookingsFragment.getClass().getName()).commitAllowingStateLoss();
        getSupportFragmentManager()executePendingTransactions()。


解决方案

我下手:


  • 替换为:

     ((HomeActivity)Variables.context).getSupportFragmentManager()调用BeginTransaction()。删除(((HomeActivity) Variables.context).getSupportFragmentManager().findFragmentById(R.id.fragmentspace)).commitAllowingStateLoss();
                ((HomeActivity)Variables.context).getSupportFragmentManager()executePendingTransactions()。
                ((HomeActivity)Variables.context).getSupportFragmentManager()调用BeginTransaction()。添加(R.id.fragmentspace,新MyBidsFragment().newInstance(booking)).addToBackStack(MyBidsFragment.class.getName()).commitAllowingStateLoss();
                ((HomeActivity)Variables.context).getSupportFragmentManager()executePendingTransactions()。

     ((HomeActivity)getActivity())。getSupportFragmentManager()。
              的BeginTransaction()。
              更换(R.id.fragmentspace,新MyBidsFragment()的newInstance(预订))。
              承诺();

    (顺便说一句,让的newInstance() 静态,所以你不会做这种奇怪的新实例初始化的 MyBidsFragment


  • 然后替换

      myBookingsFragment = MyBookingsFragment.newInstance(updateBooking);
            getSupportFragmentManager()调用BeginTransaction()。添加(R.id.fragmentspace, myBookingsFragment).addToBackStack(myBookingsFragment.getClass().getName()).commitAllowingStateLoss();
            getSupportFragmentManager()executePendingTransactions()。

      myBookingsFragment = MyBookingsFragment.newInstance(updateBooking);
     getSupportFragmentManager()调用BeginTransaction()。
               更换(R.id.fragmentspace,myBookingsFragment)。
               addToBackStack(myBookingsFragment.getClass()。的getName())。
               承诺();

    替换() ,不是添加()


  • 然后我会做一些事情的事实,该活动有1000行code的。它使code更难维护和理解(甚至+张贴在SO)


我希望,它有助于

The issue appears to be that fragments seem to load in a very strange way in RARE occurrences.

Sometimes the view of a Fragment is NOT visible, onCreateView is called, but it does NOT add the view to the activity, it just loads a blank white page. When onResume is called from resuming the app (such as going to recent applications and clicking my app) the view appears.

ALL fragment transactions are done on the MAIN thread obviously.

This happens approx 1 in every 20 times.

I am happy to supply ANY code you want. So if something is missing then please let me know and I will happily supply it for you

My onCreate in my activity:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Variables.context = this;
        Variables.activity = this;
        Variables.p_class = HomeActivity.class;

        setContentView(R.layout.activity_main);

        toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);


        drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
                this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
        drawer.setDrawerListener(toggle);
        toggle.syncState();

        if (getSupportActionBar() != null) {
            getSupportActionBar().setDisplayHomeAsUpEnabled(false);
        }

        toolbar.setNavigationIcon(null);
        toolbar.getMenu().clear();

        NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
        navigationView.setNavigationItemSelectedListener(this);

        actionbar_pw_spinner = (ProgressWheel) findViewById(R.id.actionbar_pw_spinner);
        actionbar_pw_mins = (TextView) findViewById(R.id.actionbar_pw_mins);

        actionBarTitleTV = (TextView) findViewById(R.id.custom_actionbar_title);

        usersName = (TextView) findViewById(R.id.usersName);
        usersEmail = (TextView) findViewById(R.id.usersEmail);

        actionBarTitleTV.setText(this.getTitle());

        btnBack = (ImageView) findViewById(R.id.button_back);
        btnBack.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                onBackPressed();
            }
        });
        btnBack.setVisibility(View.GONE);

        btnMenu = (ImageView) findViewById(R.id.button_menu);
        btnMenu.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                openDrawer();
            }
        });
        btnMenu.setVisibility(View.GONE);

        setPersonInfo();

        Fabric.with(this, new Crashlytics());

        Variables.myLocation = new Location("myLoc");
        Variables.myLocation.setLatitude(0.0);
        Variables.myLocation.setLongitude(0.0);

        if (!Variables.isThisBidTaxi()) {
            CustomerComms.myOwnSocket = new MySocket(null);
            CustomerComms.myOwnSocket.start();
        }

        SettingSQLHelper helper = new SettingSQLHelper(HomeActivity.this);
        Variables.setting = helper.getSetting();
        helper.close();

        mRequestingLocationUpdates = false;

        buildGoogleApiClient();
        createLocationRequest();
        buildLocationSettingsRequest();
        checkLocationSettings();

        setTitle("");

        if (savedInstanceState != null) {
            return;
        } else {
            getSupportFragmentManager().beginTransaction().add(R.id.fragmentspace, new SplashFragment()).commitAllowingStateLoss();
            ((HomeActivity) Variables.context).getSupportFragmentManager().executePendingTransactions();
        }

        containLayout = null;
        containLayout = (FrameLayout) findViewById(R.id.fragmentspace);

        getSupportFragmentManager().addOnBackStackChangedListener(getListener());
        m_updateBooking = (Booking) getIntent().getSerializableExtra("booking");

        m_TrackDriver = (Boolean) getIntent().getSerializableExtra("track");

        Variables.initBooking();
    }

My onResume in my activity:

 protected void onResume() {
        super.onResume();

        if (mGoogleApiClient.isConnected() && mRequestingLocationUpdates) {
            startLocationUpdates();
        }

        Variables.context = this;
        Variables.activity = this;

        if (m_updateBooking != null) {

            if (m_updateBooking.getJobStatus() == Booking.eeJob_Complete) {
                if (!Variables.driverrated) {
                    DriverRatingFragment DriverRatingFRA = DriverRatingFragment.newInstance(m_updateBooking);
                    getSupportFragmentManager().beginTransaction().add(R.id.fragmentspace, DriverRatingFRA).addToBackStack(DriverRatingFragment.class.getName()).commitAllowingStateLoss();
                    ((HomeActivity) Variables.context).getSupportFragmentManager().executePendingTransactions();

                }
            } else {
                if (m_TrackDriver) {
                    getSupportFragmentManager().beginTransaction().add(R.id.fragmentspace, TrackingDriverFragment.newInstance(m_updateBooking)).addToBackStack(TrackingDriverFragment.class.getName()).commitAllowingStateLoss();
                    ((HomeActivity) Variables.context).getSupportFragmentManager().executePendingTransactions();

                } else {
                    gotoMyBooking(m_updateBooking);
                }
            }
        }

        m_updateBooking = null;
        getIntent().removeExtra("booking");
        getIntent().removeExtra("track");

        if (Variables.setting == null) {
            final SettingSQLHelper helper = new SettingSQLHelper(HomeActivity.this);
            Variables.setting = helper.getSetting();
        }

    }

My onPause

  @Override
    protected void onPause() {
        super.onPause();
        if (mGoogleApiClient.isConnected()) {
            stopLocationUpdates();
        }
    }

My onCreateView inside a fragment looks like this:

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
           inflatedView = inflater.inflate(R.layout.fragment_new_booking, container, false);//the rest of my code then follows here
    return inflaterview
        }

My activity XML file looks like this:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:ProgressWheel="http://schemas.android.com/apk/res-auto"
    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:openDrawer="start">

    <android.support.design.widget.CoordinatorLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fitsSystemWindows="true"
        tools:context=".Activity.HomeActivity">

        <android.support.design.widget.AppBarLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:theme="@style/AppTheme.AppBarOverlay">

            <android.support.v7.widget.Toolbar
                android:id="@+id/toolbar"
                android:layout_width="match_parent"
                android:layout_height="?attr/actionBarSize"
                android:background="?attr/colorPrimary"
                app:popupTheme="@style/AppTheme.PopupOverlay">

                <FrameLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_centerVertical="true">

                    <TextView
                        android:id="@+id/custom_actionbar_title"
                        android:layout_width="fill_parent"
                        android:layout_height="wrap_content"
                        android:layout_gravity="center"
                        android:gravity="center"
                        android:singleLine="true"
                        android:text="@string/new_booking"
                        android:textColor="@color/White"
                        android:textSize="18sp" />

                    <FrameLayout
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_gravity="center_vertical">

                        <ImageView
                            android:id="@+id/button_back"
                            android:layout_width="30dp"
                            android:layout_height="30dp"
                            android:layout_gravity="center_vertical|start"
                            android:contentDescription="@string/back_button"
                            android:fitsSystemWindows="true"
                            android:src="@drawable/ic_arrow_back_white_24dp" />

                        <ImageView
                            android:id="@+id/button_menu"
                            android:layout_width="30dp"
                            android:layout_height="30dp"
                            android:layout_gravity="center_vertical|start"
                            android:contentDescription="@string/menu_button"
                            android:fitsSystemWindows="true"
                            android:src="@drawable/ic_menu_white_24dp" />
                    </FrameLayout>

                    <com.todddavies.components.progressbar.ProgressWheel
                        android:id="@+id/actionbar_pw_spinner"
                        android:layout_width="30dp"
                        android:layout_height="30dp"
                        android:layout_gravity="top|end"
                        android:layout_marginRight="10dp"
                        android:visibility="gone"
                        ProgressWheel:barColor="#86f066"
                        ProgressWheel:barLength="10dp"
                        ProgressWheel:barWidth="1dp"
                        ProgressWheel:rimColor="@color/White"
                        ProgressWheel:rimWidth="2dp"
                        ProgressWheel:textColor="@color/White"
                        ProgressWheel:textSize="15sp" />

                    <TextView
                        android:id="@+id/actionbar_pw_mins"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_gravity="right"
                        android:layout_marginRight="15dp"
                        android:layout_marginTop="27dp"
                        android:text="@string/mins"
                        android:textColor="@color/White"
                        android:textSize="10sp"
                        android:visibility="gone" />

                </FrameLayout>

            </android.support.v7.widget.Toolbar>

        </android.support.design.widget.AppBarLayout>

        <FrameLayout
            android:id="@+id/fragmentspace"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@color/White" />

    </android.support.design.widget.CoordinatorLayout>

    <android.support.design.widget.NavigationView
        android:id="@+id/nav_view"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:fitsSystemWindows="true"
        app:headerLayout="@layout/nav_header_main"
        app:menu="@menu/activity_main_drawer" />

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

My Android Manifest looks like this:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.commandsoftware.androidbookingapp"
    android:installLocation="auto">

    <uses-permission android:name="com.chasesoftware.cabmaster.permission.MAPS_RECEIVE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.RECEIVE_SMS" />
    <uses-permission android:name="android.permission.VIBRATE" />
    <uses-permission android:name="android.permission.CALL_PHONE" />
    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
    <uses-permission android:name="android.permission.READ_CONTACTS" />
    <uses-permission android:name="android.permission.READ_PROFILE" />
    <uses-permission android:name="android.permission.USE_CREDENTIALS" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">>
        <activity
            android:name=".Activity.HomeActivity"
            android:label="@string/app_name"
            android:noHistory="false"
            android:screenOrientation="portrait">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <meta-data
            android:name="com.google.android.gms.version"
            android:value="@integer/google_play_services_version" />
        <meta-data
            android:name="com.google.android.maps.v2.API_KEY"
            android:value="@string/google_api" />

        <receiver android:name=".Activity.SMSReceiver">
            <intent-filter>
                <action android:name="android.provider.Telephony.SMS_RECEIVED" />
            </intent-filter>
        </receiver>

        <meta-data
            android:name="io.fabric.ApiKey"
            android:value="@string/fabric_key" />

        <meta-data
            android:name="com.facebook.sdk.ApplicationId"
            android:value="@string/facebook_app_id" />

        <provider
            android:name="com.facebook.FacebookContentProvider"
            android:authorities="@string/facebook_api"
            android:exported="false" />

        <activity
            android:name="com.facebook.FacebookActivity"
            android:configChanges="keyboard|keyboardHidden|screenLayout|screenSize|orientation"
            android:label="@string/app_name"
            android:theme="@android:style/Theme.Translucent.NoTitleBar" />

    </application>

</manifest>

When I commit a Fragment transaction my code looks like this:

((HomeActivity) Variables.context).getSupportFragmentManager().beginTransaction().remove(((HomeActivity) Variables.context).getSupportFragmentManager().findFragmentById(R.id.fragmentspace)).commitAllowingStateLoss();
            ((HomeActivity) Variables.context).getSupportFragmentManager().executePendingTransactions();
            ((HomeActivity) Variables.context).getSupportFragmentManager().beginTransaction().add(R.id.fragmentspace, new MyBidsFragment().newInstance(booking)).addToBackStack(MyBidsFragment.class.getName()).commitAllowingStateLoss();
            ((HomeActivity) Variables.context).getSupportFragmentManager().executePendingTransactions();

Another example of Fragment Transaction

 myBookingsFragment = MyBookingsFragment.newInstance(updateBooking);
        getSupportFragmentManager().beginTransaction().add(R.id.fragmentspace, myBookingsFragment).addToBackStack(myBookingsFragment.getClass().getName()).commitAllowingStateLoss();
        getSupportFragmentManager().executePendingTransactions();

解决方案

I'd start with:

  • Replace:

      ((HomeActivity) Variables.context).getSupportFragmentManager().beginTransaction().remove(((HomeActivity) Variables.context).getSupportFragmentManager().findFragmentById(R.id.fragmentspace)).commitAllowingStateLoss();
                ((HomeActivity) Variables.context).getSupportFragmentManager().executePendingTransactions();
                ((HomeActivity) Variables.context).getSupportFragmentManager().beginTransaction().add(R.id.fragmentspace, new MyBidsFragment().newInstance(booking)).addToBackStack(MyBidsFragment.class.getName()).commitAllowingStateLoss();
                ((HomeActivity) Variables.context).getSupportFragmentManager().executePendingTransactions();
    

    with

        ((HomeActivity) getActivity()).getSupportFragmentManager().
              beginTransaction().
              replace(R.id.fragmentspace, new MyBidsFragment().newInstance(booking)).
              commit();
    

    (btw, make newInstance() static, so you won't do this strange initialization of new instance of MyBidsFragment)

  • Then replace

     myBookingsFragment = MyBookingsFragment.newInstance(updateBooking);
            getSupportFragmentManager().beginTransaction().add(R.id.fragmentspace, myBookingsFragment).addToBackStack(myBookingsFragment.getClass().getName()).commitAllowingStateLoss();
            getSupportFragmentManager().executePendingTransactions();
    

    with

     myBookingsFragment = MyBookingsFragment.newInstance(updateBooking);
     getSupportFragmentManager().beginTransaction().
               replace(R.id.fragmentspace, myBookingsFragment).
               addToBackStack(myBookingsFragment.getClass().getName()).
               commit();
    

    replace(), not add()

  • Then I'd do something with the fact, that Activity has 1000 lines of code. It makes code much harder to maintain and understand (+ even post on SO)

I hope, it helps

这篇关于片段事务负载空白视图的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆