[英]Android: Getting white screen with fragment transaction
我正在制作一個新聞應用程序,其中我有一個片段,其中包含列表中的所有新聞以及另一個包含視頻列表的片段。 當你觸摸一個新的時,它將從名為openNewsCont的活動中調用一個方法,該方法將用另一個替換當前的片段。
我遇到的問題是,當我調用該方法時,我得到一個空白屏幕,我看了很多其他代碼,但我找不到解決問題的方法。
這是我從MainActivity.java調用的方法
public void openNewsCont(String text) {
android.support.v4.app.FragmentManager fm = getSupportFragmentManager();
android.support.v4.app.FragmentTransaction ft = fm.beginTransaction();
ft.replace(R.id.pager, new NewsContent() );
ft.addToBackStack(null);
ft.commit();
fm.executePendingTransactions();
}
這是保存新聞並從MainActivity.java調用方法的Tab1.java
package com.example.link_test;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.LinearLayout;
public class Tab1 extends Fragment {
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
final View android = inflater.inflate(R.layout.tab1, container, false);
LinearLayout newLink = (LinearLayout) android.findViewById(R.id.news1);
newLink.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
String text = "Text from fragment";
MainActivity ma = (MainActivity) getActivity();
ma.openNewsCont(text);
}
});
return android;
}
}
這里是應該調用的片段,並顯示一個空白的屏幕NewsContent.java
package com.example.link_test;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
public class NewsContent extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.news_content, container, false);
return view;
}
}
將片段替換為:
Fragment feeddetailFragment = new FeedDetailFragment();
feedFragment.getFragmentManager().beginTransaction()
.replace(R.id.frame_container, feeddetailFragment,Constant.FRAGMENT_FEEDDETAIL)
.addToBackStack(null)
.commit();
它會工作..
如果仍然無法正常工作,則嘗試在替換后檢查要顯示的片段,無論該片段的視圖是否為空
if (view != null) {
ViewGroup parent = (ViewGroup) view.getParent();
if (parent != null)
parent.removeView(view);
}
try {
view = inflater.inflate(R.layout.fragment_business_details,
container, false);
initializeViewObjects();
setListeners();
} catch (InflateException e) {
return view;
}
return view;
}
一個顯而易見的事情是,你有ft.addToBackStack(null); 兩次。 很確定它應該只在那里一次。
另外,我相信你需要在ft.commit()之后直接調用fm.executePendingTransactions()。
我通過刪除對v4片段的支持解決了這個問題,因為這只是我的TabAdapter所要求的,但僅適用於新聞,視頻等標簽中表示的片段。 來自未作為標簽(如NewsContent.java)進行管理的片段
這是我從Tab1打開另一個片段的方法應該如何。
public void openNewsCont() {
NewsContent nc = new NewsContent();
FragmentManager fm = getFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.replace(R.id.container, nc);
ft.addToBackStack(null);
ft.commit();
}
以下是NewsContent的內容:
package com.example.link_test;
import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
public class NewsContent extends Fragment {
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
final View android = inflater.inflate(R.layout.news_content, container, false);
return android;
}
}
感謝Eagle11努力幫助我解決這個讓我整整一個早上需要解決的問題。 我希望這個答案可以幫助像我這樣的新手。
您可以在托管片段的活動上使用此代碼。 它會檢查您的堆棧並重新啟動片段。 這是我決定在我這個問題上處理這個問題的方法之一。
@Override
public void onBackPressed() {
int fragments = getFragmentManager().getBackStackEntryCount();
Toast.makeText(this, String.valueOf(fragments), Toast.LENGTH_LONG).show();
if (fragments == 0) {
FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.container, new NewsContent());
fragmentTransaction.commit();
super.onBackPressed();
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.