ChildActivity extends BaseActivity,如何在LayoutInflater::inflate布局集中绑定视图?
ChildActivity extends BaseActivity, how to bind views in layout set with LayoutInflater::inflate?
我在尝试使用 ButterKnife 成功注入视图时遇到困难。我看到的所有示例都假设 Activity
扩展了 AppCompatActivity
,并且布局设置为 setContentView()
。我的案例涉及 Activity
扩展 BaseActivity
,并使用 LayoutInflater
的 inflate()
调用设置布局:
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 不在绑定实例的上下文中
我在尝试使用 ButterKnife 成功注入视图时遇到困难。我看到的所有示例都假设 Activity
扩展了 AppCompatActivity
,并且布局设置为 setContentView()
。我的案例涉及 Activity
扩展 BaseActivity
,并使用 LayoutInflater
的 inflate()
调用设置布局:
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 不在绑定实例的上下文中