2017-08-03 3 views
0

BaseActivityで実装された複数のアクティビティ(フラグメントを使用しない)を使用してMaterialDrawer(ライブラリMikePenz)を実装する際の問題に直面しています。また、ビューをバインドするためにButterKnifeを使用します。BaseActivity/ChildアクティビティとMaterialDrawerでのButterknifeの使用

ここで関連する問題が見つかりましたが、1つずつ試してみましたが、私のケースではほとんどが標準のナビゲーション・ドロワーを使用しているため、バター・ナイフとは関係ありません。

コード:

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ようSO検索いくつかの方法を試みたが、成功しませんでした。

ご協力いただきありがとうございます。前もって感謝します。

答えて

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

上記のコードでは、setContentView(getLayoutResourceId())を宣言したBaseActivityを求めています。あなたがsetContentView(R.layout.activity_main)を呼び出していないので、activity_mainをロードしている場所から。 BaseActivity(上のコード)では、利用可能な要点はありますか? –

1

MaterialDrawerはレイアウトにビューを広げます。デフォルトでは、アクティビティのルートにDrawerLayoutが追加され、他のコンテンツ(メインレイアウト)が子として再度追加されます。

この決定は特別な変更を加えることなくアプリケーションにDrawerを実装することを非常に簡単にするために行われました。

bindメソッドを呼び出すときにButterknifeがビューをバインドします。 MaterialDrawerのすべてのビューは、.build()を呼び出した時点でバインドされていますが、MaterialDrawerのビューは内部的にバインドされているため、これらについては心配する必要はありません。

+0

お返事ありがとうございます。私のコードに従って、BaseActivityから使用する必要がある場合はどうすればいいのですか? – user2695433

+0

あなたは本当に何が問題なのか言及していませんでした:D – mikepenz

+0

ああ申し訳ありません。私はBaseActivityでMaterialDrawerを使用していますが、子アクティビティをこの(コード投稿)から継承していますが、引き出しがロードされていないかクラッシュしています – user2695433

0

@ user2695433の答えを完成させるには、もう少し進むことができます:すべてのバターナイフのinitを処理し、BaseActivityで閉じると、ressourcesをリリースすることを忘れることはありません!いくつかの新しいデベロッパーがあなたのチームに来て、バターナイフの仕組みを知らないと非常に便利です。ここでは、次のとおりです。BaseActivityで

-------- ------- ConcreteActivityで

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); 
    } 
関連する問題