Android:在Activity中使用ButterKnife从另一个活动扩展

时间:2016-11-14 06:46:51

标签: android exception android-activity butterknife

我想在所有活动中使用导航抽屉。所以我使用了BaseActivity for Navigation抽屉,并从基础活动中扩展了其他活动。基础活动有导航抽屉。仪表板活动正在扩展基本活动,但当我尝试使用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?

3 个答案:

答案 0 :(得分: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(this)后,frameLayout就可以使用了。确保您的活动布局文件中存在framelayout标识dashboard_frameLayout

答案 1 :(得分:0)

在你的情况下&#34; ButterKnife.bind(this)&#34; (来自BaseActivity的onCreate())在DashBoardActivity的OnCreate()之前被调用。因此,当ButterKnife尝试绑定activity_base的视图时,它无法在activity_base布局中找到视图ID R.id.dashboard_frameLayout,它会抛出异常。

要绑定视图,应该将视图组之类的容器(例如RelativeLayout)添加到activity_base。在BaseActivity中创建addViews()方法。然后通过调用Baseactivity的addViews()将视图activity_dashboard布局从DashBoardActivity的onCreate()添加到该容器。现在你可以添加&#34; ButterKnife.bind(this)&#34; addViews()方法(你不应该在两个活动中的任何其他地方调用ButterKnife.bind)。有一点需要注意,你必须使用findViewById在BaseActivity中获取容器的视图id引用,其余的视图将由ButterKnife绑定。

答案 2 :(得分: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);
}