ChildActivity extends BaseActivity,如何在LayoutInflater::inflate布局集中绑定视图?

ChildActivity extends BaseActivity, how to bind views in layout set with LayoutInflater::inflate?

我在尝试使用 ButterKnife 成功注入视图时遇到困难。我看到的所有示例都假设 Activity 扩展了 AppCompatActivity,并且布局设置为 setContentView()。我的案例涉及 Activity 扩展 BaseActivity,并使用 LayoutInflaterinflate() 调用设置布局:

public class BaseActivity extends AppCompatActivity {
    @BindView(R.id.drawer_layout) DrawerLayout drawerLayout;
    @BindView(R.id.toolbar) Toolbar toolbar;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.base);
        ButterKnife.bind(this);
    }
}

这是ChildActivity:

public class ChildActivity extends BaseActivity {
    @BindView(R.id.content) FrameLayout content; // content is in the base layout
    @BindView(R.id.recycler_view) RecyclerView recyclerView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // content (below) is a FrameLayout in the BaseActivity
        getLayoutInflater().inflate(R.layout.child, content);
        ButterKnife.bind(this);
    }
}

当我 运行 应用程序时,出现错误:

Required view 'recycler_view' with ID 2131230798 for field 'recyclerView' 
was not found. If this view is optional add '@Nullable' (fields) or 
'@Optional' (methods) annotation.

所以我按照建议添加@Nullable

 @BindView(R.id.recycler_view) @Nullable RecyclerView recyclerView;

另一个错误:

java.lang.NullPointerException: Attempt to invoke virtual method 'void
 android.support.v7.widget.RecyclerView.setLayoutManager(android.support.v
7.widget.RecyclerView$LayoutManager)' on a null object reference

当我删除 @Nullable 时,我又回到了原点。我该如何解决?

and the layout being set with a LayoutInflater's inflate() call

getLayoutInflater().inflate returns 一个全新的视图,需要与 activity 内容视图分开绑定。如果你想使用 那个视图,你不需要膨胀它,因为你只需要用布局 ID 调用 setContentView。

不过,如果您想使用 FrameLayout 执行此操作,我建议您使用 Fragments。

您将 @BindView FrameLayout,然后使用 getSupportFragmentManager() 动态添加片段 .是否在 Fragments 中使用 Butterknife 是一个实现细节。

至少,在 XML 中使用 <include> 标记而不是 FrameLayout。您的错误存在是因为 Recyclerview 不在绑定实例的上下文中