片段事务负载空白视图 [英] Fragment Transaction loads a blank view
问题描述
问题似乎是,似乎碎片在极少数情况下一个很奇怪的方式来加载。
有时一个片段的观点是不可见的,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:机器人=http://schemas.android.com/apk/res/android
的xmlns:ProgressWheel =http://schemas.android.com/apk/res-auto
的xmlns:程序=http://schemas.android.com/apk/res-auto
的xmlns:工具=http://schemas.android.com/tools
机器人: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>
我的Android清单如下:
<?XML版本=1.0编码=UTF-8&GT?;
<清单的xmlns:机器人=http://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_STORAGE/>
<使用许可权的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 ofMyBidsFragment
)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()
, notadd()
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屋!