空指针异常,无法从我的布局获取我的文本视图



编辑:回答了我自己的问题。

我的文本视图为空,我不明白为什么。我使用个人片段管理器,也许这是问题所在。我的 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之后触发的。但我相信根据我的经验,而不是从文档中,视图可能还没有准备好使用。您可以通过旋转屏幕来测试此行为。

问题是我的片段没有添加到我的活动中(我没有在我的活动布局中定义片段(。一个简单的解决方法是将它们全部添加到活动布局中,并使用隐藏/显示而不是添加/删除。

最新更新