6

ナビゲーション用ドロワーにはhttps://github.com/neokree/MaterialNavigationDrawer、FAB用にはhttps://gist.github.com/Jogan/9def6110edf3247825c9が使用されています。ナビゲーション・ドロワーを開くと、FABはカバーされず、その上にボタンが表示されます。私は、ボタンを隠して、それがむしろ気を散らしているように、ドロワの開閉にそれを表示しないようにしたいと思います。どのようにこれを修正するための任意のアイデア?ナビゲーションドロワー上に浮動アクションボタンが表示されます

編集: 私はプログラム的に以下のことFABを追加しています:

fabButton = new FloatingActionButton.Builder(this) 
      .withDrawable(getResources().getDrawable(R.drawable.ic_action_edit)) 
      .withButtonColor(0xFF2196F3) 
      .withGravity(Gravity.BOTTOM | Gravity.END) 
      .withMargins(0, 0, 16, 16) 
      .create(); 

それを修正しないフラグメントにその宣言を変更します。上にリンクしたNav Barの実装では、Material Drawingを最初に描画するMaterialNavigationDrawerクラスから継承するアクティビティが必要です。ボタンは常に最後になります。プログラム的に要素の順序を強制する方法はありますか?

答えて

7

このFABの実装ではコンテンツビュー(android.R.id.content)にFABが追加されているため、ナビゲーションドロワーが開いているときにFABが表示されます。ナビゲーションドロワの実装によっては、ビュー階層内で同じレベルにあるように見えます。

異なるFAB実装に切り替える必要がない場合。 onDrawerSlide(View drawerView, float offset)を使用し、引き出しを開くときにFABアルファを変更します。また、可視性をonDrawerClose()またはonDrawerOpen()の方法で切り替えることもできます。

編集:

@Override 
public void onDrawerSlide(View drawerView, float offset){ 
    fabButton.setAlpha(offset); 
} 
+0

私は可視性を変更しようとしましたが、動作しますが、アニメーションは引き出しからボタンに向かって注意を引いています。アルファについて詳しく説明してください、私はそれに精通していません。 –

+1

もう2つの選択肢があります。元の実装を修正して、FABをフラグメントレイアウトに追加するか、nav drawerが見えるとすぐにfabを非表示にします。アルファの変更についての私の編集をご覧ください。 –

+0

実装はアニメーションに役立ちます。私は理想的には、ボタンの上にナビゲーション引き出しを重ねたいと思っています。私が抱えている問題は、Nav Drawerの実装でonCreateメソッドを持たないため、コンテンツビューを設定できないということです。代わりに、ドロワの最初のセクションに固定されたフラグメントを起動するので、フラグメントのレイアウトはその時点で利用できません。コンテンツビューで注文を変更する方法はありますか? –

2

私は(それが遅延のように見えるもの)、それにアルファが関与や引き出しのは、開閉ボタンをトグルしないきちんとした解決策を見つけました。プログラムによって、ボタンの終了マージンを変更して、ドロワのオフセットが変化している間にアクティビティのウィンドウから遷移することができます。

だから、まず第一に、onDrawerSlide方法の外に、あなたは次のコードでFABのレイアウトパラメータを取得する必要があります(レイアウト上のボタンの中にもよるが、私の場合には、それはFrameLayoutです):

final FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) fab.getLayoutParams(); 

y = mx + n、yはマージン、mはスロープ(変更可能)、xはslideOffset、そして 'x'は単純な数学的線形方程式に基づいています。 nはデフォルト/元のマージン(16dp)です。これは、ディスプレイ密度の豊かさを尊重しながら、ピクセルなどの変数にデフォルトのマージンとスロープを割り当てる方法です:

int density = (int) Resources.getSystem().getDisplayMetrics().density; 
final int defaultMargin = 16 * density; 
final int slope = -100 * density; 

その後、onDrawerSlide内部で、次の操作を実行します。

params.setMarginEnd((int) (slope * slideOffset + defaultMargin)); 
fab.setLayoutParams(params); 

これが「doesnの場合あなたのために働いて、それを構築するときにボタンのmarginEndを設定しようとするか、またはこのようなレイアウトのパラメータのマージンを設定してください(が右か左かをチェックしなければならないでしょう):

params.setMargins(int left, int top, int right, int bottom); 

私はこれが助けてくれることを願っています。これは私の最初の答えですので、それについて多くの苦情がないことを願っています。

1

これは私のために働く別の解決策です。 yourlayout.xmlにFABを追加するとします。 は、今すぐこのようなFAB宣言を変更

public FloatingActionButton create(FrameLayout framelayout) { 
    ... 
    framelayout.addView(button, params); 
    return button; 
} 

と方法

public FloatingActionButton create() { 
    ... 
    ViewGroup root = (ViewGroup) activity.findViewById(android.R.id.content); 
    root.addView(button, params); 
    return button; 
} 

を交換FloatingActionButton.javaで今yourlayout.xml

<FrameLayout 
     android:id="@+id/myframelayout" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 

中でframeLayoutを作成します。

FrameLayout yourframelayout = (FrameLayout)findViewById(R.id.myframelayout); 

fabButton = new FloatingActionButton.Builder(this) 
     .withDrawable(getResources().getDrawable(R.drawable.ic_action_edit)) 
     .withButtonColor(0xFF2196F3) 
     .withGravity(Gravity.BOTTOM | Gravity.END) 
     .withMargins(0, 0, 16, 16) 
     .create(yourframelayout); 

これはそれです!

0

私はニコラDespotoskiソリューションを更新しています:いつでもユーザーがファブが起こる、その後は何も示されていない場所でタップので、もし

だから、あなたがアルファを設定した後も、ファブを無効化/非表示にする必要があります。

mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, R.string.drawer_open, 
       R.string.drawer_close) { 
    public void onDrawerClosed(View view) { 
       // Visible/Enable the FAB 
    } 

    public void onDrawerOpened(View drawerView) { 
       // Hide/Disable the FAB 
    } 

    @Override 
    public void onDrawerSlide(View drawerView, float slideOffset) { 
       // invert the slideOffset value 
       fab.setAlpha(1-slideOffset); 
    } 
}; 
関連する問題