0

问题似乎是在RARE事件中以非常奇怪的方式加载了片段。片段事务加载空白视图

有时,片段的视图不可见,onCreateView被调用,但它不会将视图添加到活动,它只是加载一个空白的白页。当从恢复应用程序调用onResume时(例如转到最近的应用程序并单击我的应用程序),将显示视图。

显然,所有片段事务都在MAIN线程上完成。

这种情况每20次发生约1次。

我很高兴提供您想要的任何代码。因此,如果缺少了什么,那么请让我知道,我会很高兴在我的活动提供为你

我的onCreate:

@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(); 
    } 

我的onResume在我的活动:

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(); 
     } 

    } 

我的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 
     } 

我的活动XML文件是这样的:

<?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> 

我的Android清单如下:

<?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> 

当我犯片段交易我的代码看起来是这样的:

((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(); 

片段交易

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

请你能提供的'Activity'了'Fragment'中存在的代码? – edwoollard

+0

我的活动长度为1000行,是否有任何特定的部分要保存全部复制? – apmartin1991

+0

特别是'onCreate',以及如果你正在使用它们,'onPause'和'onResume'。 – edwoollard

回答

1
另一个例子

我会以:

  • 替换:

    ((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(); 
    

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

    (顺便说一句,让newInstance()static,这样你就不会做这种奇怪的MyBidsFragment新实例的初始化)

  • 然后替换

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

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

    replace(),不add()

  • 然后,我会做一些事情的事实,该活动有1000行代码。这使得代码更难维护和理解(+即使如此张贴)

我希望,它有助于

+0

我会尽快测试。可悲的是,并不是所有的代码都是由我编写的,但我正致力于让所有的代码都可以从头开始使用:)替换和添加有什么区别?例如,我的一个片段上有一个Google Map。如果我替换该片段,地图是否需要重新加载? 例如,片段A有一张地图.. 片段A>片段B>按返回按钮>?地图现在是否再次加载? – apmartin1991

+0

@ apmartin1991替换是用于“删除”和“添加”的代码糖。在返回时,_view_将被重新创建(虽然适配器和其他内存中的对象等可能仍然存在(如果它的碎片没有被系统破坏)。我确信Google Maps有一些缓存,因此重新绘制地图应该相当快(在大多数情况下,您可以快速地重新创建视图:-)) –

+0

我将创建一个单一函数来处理这些片段。我将创建一个处理REPLACING和ADDING片段的自定义类。如果需要,我可以很容易地修改所有片段。未来的变化更容易。谷歌地图可能是缓存,但它的defo加载不正确,但我相信我可以用一段时间修复它。其余的一切似乎都没问题,但只改了20个交易,大概要60多走! – apmartin1991