2017-08-03 52 views
0

我正在使用BaseActivity實現的使用多個活動(不使用片段)實現MaterialDrawer(庫MikePenz)的問題。另外,使用ButterKnife綁定視圖。使用具有BaseActivity/Child Activities和MaterialDrawer的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(); 
    } 
} 

activity_main佈局

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

StoreActivity

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(); 

    } 
    } 

activity_store佈局

<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被調用。導航抽屜會加載,但點擊項目時會失敗,原因很明顯。我不能使用FrameLayout,因爲我使用的MaterialDrawer庫沒有(或者我不知道)有膨脹的視圖。

我試了好幾種方法,廣泛搜索等等之類SO1SO2GitGit2 Link,但沒有成功。

感謝任何幫助,深表感謝。提前致謝。

回答

1

感謝@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綁定到具體活動並使用@Nullable字段。但目前在基地和實施活動中都有約束力。

+0

其中聲明瞭activity_main? –

+0

@LOG_TAG請檢查問題,activity_main佈局以及代碼是否存在。 – user2695433

+0

我在上面的代碼BaseActivity詢問你聲明setContentView(getLayoutResourceId());你從哪裏加載activity_main,因爲你沒有調用setContentView(R.layout.activity_main);在BaseActivity中(上面的代碼)任何完全正常工作的要點? –

1

MaterialDrawer將使視圖充滿布局。默認情況下,它會將DrawerLayout添加到您的活動的根目錄中,並將其他內容(這是您的主要佈局)作爲子項添加到其中。

做出這個決定是爲了使您的應用程序實現Drawer變得非常簡單,無需改變任何特殊的東西。

在您調用bind方法時,Butterknife將綁定視圖。 MaterialDrawer的所有視圖在您調用.build()時綁定,但由於MaterialDrawer的視圖在內部綁定,所以您不必擔心這些。

+0

感謝您的好評。您能否根據我的代碼提出建議,如果需要從BaseActivity中使用,我需要做些什麼? – user2695433

+0

你沒有真正提到這個問題:D – mikepenz

+0

哦對不起Mike。我在BaseActivity中使用MaterialDrawer並且從此繼承了Child Activities(代碼發佈)但Drawer未加載或崩潰 – user2695433

0

要完成@ user2695433的答案,您可以進一步:處理所有butterknife init並在BaseActivity中關閉,以便您不會忘記釋放資源!如果一些新開發人員進入您的團隊並且不知道butterknife如何工作,那將非常有用。那就是:

--------在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 
} 

-----在ConcreteActivity ----------- -

@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); 
    }