【问题标题】:Android:Use ButterKnife in Activity extending from another activityAndroid:在从另一个活动扩展的活动中使用 ButterKnife
【发布时间】:2016-11-14 06:46:50
【问题描述】:

我想要在所有活动中使用导航抽屉。因此,我使用 BaseActivity 作为导航抽屉,并从基本活动扩展了其他活动。基本活动具有导航抽屉。仪表板活动正在扩展基本活动,但是当我尝试使用黄油刀绑定视图时会引发异常

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" />

为什么在仪表板活动中找不到框架布局?

【问题讨论】:

    标签: android exception android-activity butterknife


    【解决方案1】:

    我在我的代码中做了类似的事情。

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

    【讨论】:

      【解决方案2】:

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

      已编辑:

      在您的示例中,您已经绑定了两次视图。一个在 BaseActivity 中,另一个在 DashBoardActivity 中。

      • 无需在 BaseActivity 中执行此操作。但请确保您在子类活动中有一个 ID 为 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 id dashboard_frameLayout 存在于您的活动布局文件中。

      【讨论】:

      • 正确阅读问题。它与片段无关。它与 activity_dashboard.xml 中存在的框架布局有关。即使在绑定视图之后它也是空的。
      • 您的活动布局应该在容器内定义一个工具栏和框架布局。我没有在其中看到工具栏。
      • 如果我在子类中使用 setContentView(R.layout.activity_dashboard)。它将覆盖布局。我不会在这个活动中获得导航抽屉。y
      • 它从基本活动继承工具栏和导航抽屉。
      • @Androidjack 不,您不能 setContentView 两次。这不是一个增量过程。要重用导航抽屉,您可以定义一个 XML 文件,例如navigation_drawer.xml 并在其中定义了您的导航抽屉。然后在每个子类活动中使用:
      【解决方案3】:

      在您的情况下,“ButterKnife.bind(this)”(来自 BaseActivity 的 onCreate())在 DashBoardActivity 的 OnCreate() 之前被调用。所以当ButterKnife尝试绑定activity_base的views时,在activity_base layout中找不到view id R.id.dashboard_frameLayout,会抛出异常。

      要绑定视图,应该向activity_base 添加一个类似于视图组的容器,例如RelativeLayout。在 BaseActivity 中创建 addViews() 方法。然后通过调用 Baseactivity 的 addViews() 将视图 act​​ivity_dashboard 布局从 DashBoardActivity 的 onCreate() 添加到该容器。现在您可以将“ButterKnife.bind(this)”添加到 addViews() 方法(并且您不应该在两个活动的其他任何地方调用 ButterKnife.bind)。这里需要注意的一点是,您必须简单地使用 findViewById 来获取 BaseActivity 中容器的视图 id 引用,剩余的视图将被 ButterKnife 绑定。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-07-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多