0

我在使用 BaseActivity 实现的多个活动(不使用片段)实现 MaterialDrawer(库 MikePenz)时遇到问题。此外,使用 ButterKnife 绑定视图。

在 SO 中找到相关问题并一一尝试,但在我的情况下它不起作用,因为它们中的大多数使用带有片段的标准导航抽屉,或者它们与 ButterKnife 无关。

代码 :

MainActivity 类

public class MainActivity extends AppCompatActivity {

    @BindView(R.id.toolbar)
    Toolbar toolbar;

    private List<TestModel> destinations;
    private DestinationAdapter mAdapter;
    ProgressDialog progressDialog;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);
        setSupportActionBar(toolbar);
        navManagement();
    }
}

活动主布局

<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/maincontainer"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.tvs.ui.MainActivity">

    <android.support.design.widget.AppBarLayout
        android:id="@+id/appbar"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:theme="@style/AppTheme.AppBarOverlay"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        >

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="?attr/colorPrimary"
            app:popupTheme="@style/AppTheme.PopupOverlay"
             />

    </android.support.design.widget.AppBarLayout>

</android.support.constraint.ConstraintLayout>

商店活动

public class StoresActivity extends MainActivity {

    @BindView(R.id.searchEditText)
    EditText mSearchEditText; // errorRequired view 'searchEditText' with ID 2131558557 for field 'mSearchEditText' was not found
    @BindView(R.id.storesRecyclerView)
    RecyclerView recyclerView; // here too

    private List<TestModel> stores;
    private StoreAdapter mAdapter;

    //endregion
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_stores);
        ButterKnife.bind(this);

        loadRecyclerView();
        testData();

    }
    }

活动商店布局

<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <EditText
        android:id="@+id/searchEditText"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        />

    <android.support.v7.widget.RecyclerView
        android:id="@+id/storesRecyclerView"
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        android:scrollbars="vertical">

    </android.support.v7.widget.RecyclerView>

</android.support.constraint.ConstraintLayout>

我知道错误的原因是 MainActivity 中的 ButterKnife.Bind 在 Layout 膨胀但 Views 在继承的 Activities 中未膨胀时被调用。导航抽屉加载但在单击项目时它失败是显而易见的原因。我不能使用 FrameLayout,因为我使用的 MaterialDrawer 库没有(或者我不知道)有要膨胀的视图。

我尝试了几种广泛搜索 SO 的方法,例如SO1 SO2 Git Git2 Link但没有成功。

感谢任何帮助都深表感谢。提前致谢。

4

3 回答 3

2

感谢@mikepenz 的回复。

发布它,因为它可能对某人有帮助

该问题已通过在 BaseActivity 中创建抽象方法得到解决

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(getLayoutResourceId());

        ButterKnife.bind(this); 
        setSupportActionBar(toolbar);
        navManagement();

    }
    protected abstract int getLayoutResourceId();

具体活动

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //setContentView(R.layout.activity_stores); not required
    ButterKnife.bind(this); 

    loadRecyclerView();
    testData();

}

@Override
protected int getLayoutResourceId() {
    return R.layout.activity_stores;
}

请注意,我没有在具体活动中使用 ButterKnife.Bind,而是使用了 @Nullable 字段。但目前在基础活动和实施活动中都具有约束力。

于 2017-08-04T12:04:56.567 回答
1

MaterialDrawer将使视图膨胀到您的布局。默认情况下,它会将 a 添加DrawerLayout到您的活动的根目录中,并再次将其他内容(这是您的主要布局)添加为子项。

做出这个决定是为了让在您的应用程序中实现 a 变得超级简单,Drawer而无需更改任何特殊内容。

Butterknife 将在您调用该bind方法时绑定视图。MaterialDrawer 的所有视图都在您调用时绑定.build(),但由于 MaterialDrawer 的视图在内部绑定,您不必担心这些。

于 2017-08-04T08:41:56.610 回答
0

要完成@user2695433 的回答,您可以走得更远一点:处理所有butterknife init 并在BaseActivity 中关闭,这样您就不会忘记释放资源!如果您的团队中有一些新开发人员不知道黄油刀是如何工作的,这将非常有用。这里是 :

--------在BaseActivity中--------

protected Unbinder binder;
protected abstract int getLayoutResourceId();
...

  @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(getLayoutResourceId());
        binder = ButterKnife.bind(this);
    }

@Override
protected void onDestroy() {
    super.onDestroy();
    binder.unbind(); //release ressource
}

----- 在具体活动中------------

@BindView(R.id.title)
    TextView title; // butterknife stuff

@Override
    protected int getLayoutResourceId() { //define which Id
        return R.layout.activity_main;
    }
 @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
  }
于 2017-12-24T17:37:23.877 回答