2016-03-27 17 views
4

私はナビゲーションドロワーと4つのナビゲーションアイテム(フラグメント)を持つアプリを持っています。フラグメントの1つでは、ビューページャー(3つのフラグメント)でタブレイアウトが設定されています。フラグメントからナビゲーションドロワーを無効にする

これらの内側のフラグメントの1つから、ナビゲーション・ドロワーを動的に使用不可にしたいとします。基本的には、ボタンを押すと、ナビゲーション・ドロワへのアクセスを制限したい(また、再度押すと再び有効にする)。

どうすればよいですか?

この内部フラグメントから親アクティビティのDrawerLayoutにアクセスしようとしました。しかし、ナビゲーション・ドロワを有効/無効にする方法はありません。

私は私のメインの活動に引き出しを追加した方法:

Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
setSupportActionBar(toolbar); 

DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
toggle = new ActionBarDrawerToggle(this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close); 
drawer.setDrawerListener(toggle); 

NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view); 
navigationView.setNavigationItemSelectedListener(this); 

(もちろん私は​​メソッド内からtoggle.syncState()を追加しましたこれを行うには

+0

'DrawerLayout'に' setDrawerLockMode() 'を使い、' ActionBarDrawerToggle'に 'setDrawerIndicatorEnabled()'を使います。 –

+0

@MikeM。 'setDrawerLockMode()'をセットするとスワイプジェスチャが止まりました。しかし 'setDrawerIndicatorEnabled()'を設定するには、私のフラグメント内から 'ActionBarDrawerToggle'にアクセスするにはどうしたらいいですか? – Roshnal

+0

理想的には、Activityで実装されている 'interface'を通して理想的です。アクティビティの' interface'メソッドは上記のメソッドを呼び出します。 –

答えて

23

クリーンな方法があります。 Activityが実装するinterfaceを作成します。Fragmentは、ドロワーロックおよびトグルボタンの状態を処理するActivityのローカルメソッドを呼び出すことができます。

Activityさん interface方法で
public interface DrawerLocker { 
    public void setDrawerEnabled(boolean enabled); 
} 

、我々は単にDrawerLayout#setDrawerLockMode()コールのためのロックモード定数を把握し、ActionBarDrawerTogglesetDrawerIndicatorEnabled()を呼び出します。 Fragment

public class MainActivity extends Activity implements DrawerLocker { 

    public void setDrawerEnabled(boolean enabled) { 
     int lockMode = enabled ? DrawerLayout.LOCK_MODE_UNLOCKED : 
           DrawerLayout.LOCK_MODE_LOCKED_CLOSED; 
     drawer.setDrawerLockMode(lockMode); 
     toggle.setDrawerIndicatorEnabled(enabled); 
    } 

    ... 
} 

、我々は単にinterfaceにホスティングActivityをキャストする必要があり、それに応じてsetDrawerEnabled()メソッドを呼び出します。

((DrawerLocker) getActivity()).setDrawerEnabled(false); 

NB:例えば、引き出しシャットロックするためのV7 APPCOMPATサポートライブラリのバージョン23.2.0以降、ActionBarDrawerToggleDrawerLayoutのロックモードを、引き出し状態の場合をトグルしませんロックされています。つまり、setDrawerIndicatorEnabled()を使用することは厳密には必要ではありませんが、トグルが無効になっていることをユーザーに視覚的に示すためには、これを行うことが望ましい場合もあります。

関連する問題