Android:在活动中使用ButterKnife从其他活动延伸
我希望在所有活动中使用导航抽屉。因此,我使用了BaseActivity作为导航抽屉并从基本活动中扩展了其他活动.Base活动具有导航抽屉。仪表盘活动延伸基地活动,但它会引发异常,当我尝试使用butterknife绑定的观点说
Android:在活动中使用ButterKnife从其他活动延伸
java.lang.IllegalStateException: Required view 'dashboard_frameLayout' with ID 2131558517 for field 'frameLayout' was not found.
这里有相关的文件
BaseActivity.java
public class BaseActivity extends AppCompatActivity {
@BindView(R.id.toolbar) Toolbar toolbar;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_base);
ButterKnife.bind(this);
//set toolbar and both Navigation Drawer
}
DashboardActivity.java
public class DashBoardActivity extends BaseActivity {
@BindView(R.id.dashboard_frameLayout)
FrameLayout frameLayout;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
View view = getLayoutInflater().inflate(R.layout.activity_dashboard,frameLayout);
ButterKnife.bind(this,view);
init();
}
private void init() {
Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.dashboard_frameLayout);
if(fragment != null){
Utils.getInstance().addFragment(this,new Fragment_Dashboard(),R.id.dashboard_frameLayout);
}
}
}
activity_dashboard.xml
<FrameLayout
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/dashboard_frameLayout"
android:layout_height="match_parent"
android:layout_width="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
为什么在仪表板活动中未找到framelayout?
我错了我没有仔细检查问题。
编辑:
在您的例子已经绑定的意见的两倍。一个在BaseActivity中,另一个在DashBoardActivity中。
- 不需要在BaseActivity中做到这一点。但请确保在子类活动中有一个工号为R.id.toolbar的工具栏。
-
没有必要膨胀布局R.layout.activity_dashboard,你已经在setContentView中完成了。它应该是这样的:
@Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_dashboard); ButterKnife.bind(this); init(); }
你触发ButterKnife.bind(本)之后,是的FrameLayout准备使用。确保framelayout id dashboard_frameLayout
存在于您的活动布局文件中。
在你的情况 “ButterKnife.bind(本)”(从的onCreate(BaseActivity的))被DashBoardActivity的OnCreate中()之前调用。所以当ButterKnife尝试绑定activity_base的视图时,它无法在activity_base布局中找到视图ID R.id.dashboard_frameLayout,这会引发异常。
要绑定视图,应该将一个容器(如RelativeLayout等视图组)添加到activity_base中。在BaseActivity中创建一个addViews()方法。然后通过调用Baseactivity的addViews()将视图activity_dashboard布局添加到来自DashBoardActivity的onCreate()的容器中。现在,您可以将“ButterKnife.bind(this)”添加到addViews()方法(并且您不应该在两个活动的其他任何地方调用ButterKnife.bind)。这里有一点要注意,您必须只需通过使用findViewById,剩余的观点将受到ButterKnife得到结合得到BaseActivity容器的视图id引用。
我确实在我的代码类似的东西。
我的目标是有一个抽屉,我在不同的活动重用基地抽屉的活动,所以我希望能够在所有活动中使用activity_base_drawer
布局,但通过虚报新的意见纳入其更改的内容。
(这是一个导航抽屉活动)我有这样的保护方法
protected void inflateContent(@LayoutRes int inflatedResID){
setContentView(R.layout.activity_base_drawer);
LinearLayout contentContainer = ButterKnife.findById(this, R.id.content_container);
getLayoutInflater().inflate(inflatedResID, contentContainer);
ButterKnife.bind(this);
setSupportActionBar(toolbar);
setupNavDrawer();
}
我送底座导航抽屉布局setContentView()
具有线性布局是,我想向容器为每个扩展我的基地活动的活动充气新的布局
如您所见,LinearLayout contentContainer
正在使用findById
而不是@BindView
。我必须这样做,这样一来,因为我需要充气视图到内容容器我打电话ButterKnife.bind(this);
之前查找内容容器的布局后,我夸大使用getLayoutInflater().inflate(inflatedResID, contentContainer);
然后我打电话ButterKnife.bind(this);
最后,我这样做,取决于正在在基本活动类使用@BindView
约束布局一些设置方法。
,并在任何扩展活动的onCreate()看起来是这样的,我在那里我想夸大布局的ID发送给inflateContent()
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
inflateContent(R.layout.content_main);
}
正确读取的问题。它不是关于fragment.Its关于framelayout,它出现在activity_dashboard.xml中,即使在绑定视图后也是null。 –
和你的活动布局应该有一个工具栏和一个容器内的FrameLayout定义。我没有看到它的工具栏。 – Nicholas
如果我使用的setContentView(R.layout.activity_dashboard)在subclass.It将覆盖layout.I不会得到这个activit.y –