2016-11-14 69 views
2

我希望在所有活动中使用导航抽屉。因此,我使用了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?

回答

0

我错了我没有仔细检查问题。

编辑:

在您的例子已经绑定的意见的两倍。一个在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存在于您的活动布局文件中。

+0

正确读取的问题。它不是关于fragment.Its关于framelayout,它出现在activity_dashboard.xml中,即使在绑定视图后也是null。 –

+0

和你的活动布局应该有一个工具栏和一个容器内的FrameLayout定义。我没有看到它的工具栏。 – Nicholas

+0

如果我使用的setContentView(R.layout.activity_dashboard)在subclass.It将覆盖layout.I不会得到这个activit.y –

0

在你的情况 “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引用。

0

我确实在我的代码类似的东西。

我的目标是有一个抽屉,我在不同的活动重用基地抽屉的活动,所以我希望能够在所有活动中使用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); 
}