6

因此,我使用https://github.com/neokree/MaterialNavigationDrawer作爲我的導航抽屜,https://gist.github.com/Jogan/9def6110edf3247825c9作爲我的FAB實現。當我打開導航抽屜時,它不包含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(); 

更改該項聲明片段不解決它。我上面鏈接的導航欄實現需要從MaterialNavigationDrawer類擴展活動,該類可以首先繪製Nav Drawer,而使按鈕始終保持最後。有沒有辦法以編程方式強制元素的排序?

回答

7

由於此FAB實施會將FAB添加到內容視圖(android.R.id.content),因此您會在導航抽屜打開時看到FAB。根據導航抽屜的實現,它們看起來在視圖層次結構中處於同一級別。

如果您不想切換到不同的FAB實施。使用onDrawerSlide(View drawerView, float offset)並在打開抽屜時更改FAB Alpha。您也可以在onDrawerClose()onDrawerOpen()方法中切換其可見性。

編輯:

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

我試圖改變能見度,它的作品,但動畫從抽屜和朝着按鈕吸引注意力。請您詳細說明阿爾法,我對它不是很熟悉。 –

+1

好吧,您還有兩個選擇:修改原始實現,以將FAB添加到碎片佈局,或在導航抽屜正在偷看時立即隱藏晶圓廠。請參閱我的關於更改alpha的問題的編輯。 –

+0

該實現有助於動畫。理想情況下,我想讓導航器的抽屜覆蓋按鈕。我遇到的問題是,導航抽屜實施迫使我沒有一個onCreate方法,所以我不能設置內容視圖。相反,它會啓動固定到抽屜中第一部分的片段,因此該片段的佈局在該點不可用。有沒有辦法改變內容視圖中的順序? –

2

我發現一個整潔的解決方案,不涉及其α或切換按鈕時抽屜的開啓或關閉(這使得它看起來像一個延遲)。以編程方式,您可以修改按鈕的結束邊距,以便在抽屜的偏移更改時從按鈕的窗口跳出。

所以首先,該onDrawerSlide方法外,你必須得到FAB與下面的代碼佈局參數(取決於佈局按鈕在,於我而言,這是一個FrameLayout):

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

理解我是基於一個簡單的數學線性方程來做這件事:y = mx + n,'y'是邊距,'m'是斜率(您可以修改它),'x'是slideOffset和' 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); 

如果沒有按」你將不起作用,嘗試設置按鈕的marginEnd建設時,或設置佈局的參數的邊緣像這樣(雖然你會檢查是否marginEnd是右側或左側):

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

我希望這有助於。這是我的第一個答案,所以我希望你不會有太多的抱怨。

1

這是一個替代解決方案,適合我。 假設您想在yourlayout.xml中添加FAB。 現在yourlayout.xml

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

在FloatingActionButton.java創建的FrameLayout現在用替換法

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

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

現在改變FAB的聲明是這樣的。

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