对于具有AndroidAnnotation的@ViewById的片段的onResume,对视图的引用为null

时间:2015-12-28 12:47:27

标签: java android android-fragments android-annotations

这是我的片段代码:

EFragment
public class PreviewFragment extends Fragment
{
    @Inject Bus bus;
    @Inject HorstDb db;

    //@ViewById(R.id.preview_text_view)
    TextView previewTextView;

    public PreviewFragment() {}

    @Override public void onCreate(Bundle bundle)
    {
        super.onCreate(bundle);
        ((HorstApp)getActivity().getApplication()).getComponent().inject(this);
    }

    @Override public View onCreateView(LayoutInflater inf, ViewGroup parent, Bundle args)
    {
        super.onCreateView(inf, parent, args);
        View result = inf.inflate(R.layout.fragment_preview, parent, false);
        previewTextView = (TextView) result.findViewById(R.id.preview_text_view);
        return result;
    }

    @Override
    public void onResume() { super.onResume(); bus.register(this); }
    @Override
    public void onPause() { super.onPause(); bus.unregister(this); }

    @Subscribe
    public void onTemplateSelected(TemplateSelected se)
    {

        Cursor c = db.getReadableDatabase().query("templates", null, "_id = ?",
                                                                                            new String[] { Long.toString(se.id) },
                                                                                            null, null, null);

        if(c.moveToFirst())
        {
            previewTextView.setText(c.getString(c.getColumnIndex("content")));
        }
        c.close();
    }
}

onTemplateSelected将通过Otto在onResume中被调用。这有效,previewTextView将为非空。以下版本不起作用,因为previewTextView也是null,我在片段的最内层生命周期中,我正在使用@ViewsById。不同之处在于我没有手动重载onCreateView,而是使用@EFragment@ViewById来获取对TextView的引用。

@EFragment(R.layout.fragment_preview)
public class PreviewFragment extends Fragment
{
    @Inject Bus bus;
    @Inject HorstDb db;

    @ViewById(R.id.preview_text_view)
    TextView previewTextView;

    public PreviewFragment() {}

    @Override public void onCreate(Bundle bundle)
    {
        super.onCreate(bundle);
        ((HorstApp)getActivity().getApplication()).getComponent().inject(this);
    }

    @Override
    public void onResume() { super.onResume(); bus.register(this); }
    @Override
    public void onPause() { super.onPause(); bus.unregister(this); }

    @Subscribe
    public void onTemplateSelected(TemplateSelected se)
    {

        Cursor c = db.getReadableDatabase().query("templates", null, "_id = ?",
                                                                                            new String[] { Long.toString(se.id) },
                                                                                            null, null, null);

        if(c.moveToFirst())
        {
            previewTextView.setText(c.getString(c.getColumnIndex("content")));
        }
        c.close();
    }
}

这是使用支持库中的Fragment类。

欢迎任何提示,为什么注释不起作用,并且在第二个例子中previewTextView为null。

1 个答案:

答案 0 :(得分:0)

我使用的是PreviewFragment而不是PreviewFragment _