我正在制作一个新闻应用,其中我有一个片段,其中包含列表中的所有新闻以及另一个包含视频列表的片段。当你触摸一个新的时,它将从名为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;
}
}
答案 0 :(得分:3)
将片段替换为:
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;
}
答案 1 :(得分:0)
一个显而易见的事情是,你有ft.addToBackStack(null);两次。很确定它应该只在那里一次。
此外,我相信您需要在ft.commit()之后直接调用fm.executePendingTransactions()。
答案 2 :(得分:0)
我通过删除对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努力帮助我解决这个让我整整一个早上需要解决的问题。我希望这个答案可以帮助像我这样的新手。
答案 3 :(得分:0)
您可以在承载片段的活动上使用此代码。它检查您的堆栈并重新启动该片段。这是我最终决定解决此问题的方式之一。
@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();
}
}