2017-03-10 61 views
3

我在CoordinatorLayout的底部有TextViewSnackBar在CoordinatorLayout中出現時將視圖向上移動

但是當我顯示SnackBar時,它將覆蓋TextView

我知道我必須爲TextView定製Behavior並覆蓋layoutDependsOnonDependentViewChanged,但它不能很好地解決問題。

如果你知道,你能給我一些建議嗎?謝謝。

+0

如果你在這裏添加你的xml並解釋它多一點,你的要求是什麼? –

+0

我只想知道如何在SnackBar顯示時保持SnackBar上方的textview,並在SnackBar消失時重置它的位置。如果我什麼都不做,SnackBar將覆蓋myTextView。 – xiaoyuan

回答

1

你需要增加一個行爲到你的LinearLayout且它嵌入到CoordinatorLayout

下面是你如何做到這一點。

MoveUpwardBehavior.class

import android.os.Build; 
import android.support.design.widget.CoordinatorLayout; 
import android.support.design.widget.Snackbar; 
import android.view.View; 


public class MoveUpwardBehavior extends CoordinatorLayout.Behavior<View> { 
    private static final boolean SNACKBAR_BEHAVIOR_ENABLED; 

    @Override 
    public boolean layoutDependsOn(CoordinatorLayout parent, View child, View dependency) { 
     return SNACKBAR_BEHAVIOR_ENABLED && dependency instanceof Snackbar.SnackbarLayout; 
    } 

    @Override 
    public boolean onDependentViewChanged(CoordinatorLayout parent, View child, View dependency) { 
     float translationY = Math.min(0, dependency.getTranslationY() - dependency.getHeight()); 
     child.setTranslationY(translationY); 
     return true; 
    } 

    static { 
     SNACKBAR_BEHAVIOR_ENABLED = Build.VERSION.SDK_INT >= 11; 
    } 
} 

CustomLinearLayout.class

import android.content.Context; 
import android.support.design.widget.CoordinatorLayout; 
import android.util.AttributeSet; 
import android.widget.LinearLayout; 

@CoordinatorLayout.DefaultBehavior(MoveUpwardBehavior.class) 
public class CustomLinearLayout extends LinearLayout { 
    public CustomLinearLayout(Context context) { 
     super(context); 
    } 

    public CustomLinearLayout(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    public CustomLinearLayout(Context context, AttributeSet attrs, int defStyleAttr) { 
     super(context, attrs, defStyleAttr); 
    } 
} 

樣品XML-> activity_home

這裏user.example.charu.its2017huree是我的包名取代你的!

<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     android:layout_width="match_parent" 
     android:fitsSystemWindows="true" 
     android:layout_height="match_parent"> 
     <user.example.charu.its2017huree.CustomLinearLayout 
      android:background="#098" 
      android:gravity="bottom" 
      android:id="@+id/linearLayout" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:orientation="vertical"> 
      <TextView 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:text="Hello world" /> 
     </user.example.charu.its2017huree.CustomLinearLayout> 

最後在我的活動稱爲HomeActivity

public class HomeActivity extends Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_home); 
     CustomLinearLayout customLinearLayout = (CustomLinearLayout) findViewById(R.id.linearLayout); 
     Snackbar.make(customLinearLayout, "Text to display", Snackbar.LENGTH_LONG).show(); 

    } 

} 

來源是從這個example

+0

非常感謝。塊'onDependentViewChanged'是我想要的。真的很感謝。 – xiaoyuan

9

這TextView的是CoordinatorLayout的直接孩子,只需添加

app:layout_dodgeInsetEdges="bottom"

在TextView的屬性。

魔法!

相關問題