编辑:回答了我自己的问题。
我的文本视图为空,我不明白为什么。我使用个人片段管理器,也许这是问题所在。我的 Id 是正确的,因为如果我在主活动上添加片段并从片段 onCreate 方法更改文本,则更改文本函数将起作用。不起作用的是我有一个片段 A 添加到我的活动中,我单击一个按钮并计算我单击它的次数。然后我想将我的 FragmentC 的文本视图更改为"计数器等于 ..",只有这样我的文本视图才是空的。我怀疑它为空的原因是它尚未添加到活动中。所以onCreateView实际上没有被调用。有什么办法可以解决这个问题吗?我应该在我的响应函数中调用Fragment.OnCreateView吗?
我的课与文本视图:
public class FragmentC extends Fragment {
TextView textView;
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragmentc, container,false);
//textView = (TextView) view.findViewById(R.id.txtinfo2);
return view;
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
textView = (TextView) getActivity().findViewById(R.id.txtinfo2);
}
public void changeText(String str){
if(textView==null)
Log.e("truc", "null txt");
textView.setText("jghjh");
}
}
日志给出 txt 空
碎片.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#854f98be">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Fragment C"
android:id="@+id/txtinfo2"
android:layout_gravity="center_horizontal" />
</LinearLayout>
我放了其余的代码,因为我有自己的FragmentManager,可能是问题来自那里:
我的主要活动:
public class MainActivity extends ActionBarActivity implements Communicator{
private MonFragmentManager monFragmentManager;
public static final String TAG="truc";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
monFragmentManager = new MonFragmentManager
(getSupportFragmentManager(),R.id.container,new FragmentA(),new FragmentB(), new FragmentC());
monFragmentManager.add(1, false);
}
@Override
public void respond(String data) {
FragmentC frag = (FragmentC) monFragmentManager.getFragments()[2];
if(frag.getClass()==FragmentC.class)
Log.e("truc","fragment correct");
//log gives "fragment correct".
frag.changeText(data);
}
}
MyOwnFragmentManager 类:
public class MonFragmentManager {
private FragmentManager fm;
private Fragment[] fragments;
int container;
public MonFragmentManager(FragmentManager fm){
this.fm = fm;
fragments = fm.getFragments().toArray(new Fragment[fm.getFragments().size()]);
}
public MonFragmentManager(FragmentManager fm, int container,Fragment...frags){
this.fm = fm;
this.container=container;
fragments = new Fragment[frags.length];
for(int i=0;i<fragments.length;i++){
fragments[i]=frags[i];
}
}
public void hideAllFragments(){...}
public void showFragment(int fragmentIndex, boolean addToBackStack) {...}
public void add(int fragmentIndex, boolean addToBackStack){
FragmentTransaction transaction = fm.beginTransaction();
for (int i = 0; i < fragments.length; i++) {
if (i == fragmentIndex) {
transaction.add(container,fragments[i]);
} else if(fragments[i].isAdded()) {
transaction.remove(fragments[i]);
}
}
if (addToBackStack) {
transaction.addToBackStack(null);
}
transaction.commit();
}
public void removeAllFragments(){
FragmentTransaction transaction = fm.beginTransaction();
for(int i = 0; i < fragments.length; i++) {
transaction.remove(fragments[i]);
}
transaction.commit();
}
public Fragment[] getFragments() {
return fragments;
}
}
在 onViewCreated 方法中执行 findViewById(( 更安全。
示例代码:
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
textView = (TextView) view.findViewById(R.id.txtinfo2);
笔记:
- 使用 onViewCreated,将提供 View 参数,这是唯一的提示。
- 我知道您正在使用onActivityCreated方法,因为它是在onCreateView之后触发的。但我相信根据我的经验,而不是从文档中,视图可能还没有准备好使用。您可以通过旋转屏幕来测试此行为。
问题是我的片段没有添加到我的活动中(我没有在我的活动布局中定义片段(。一个简单的解决方法是将它们全部添加到活动布局中,并使用隐藏/显示而不是添加/删除。