2017-03-21 27 views
1

マテリアルデザインが初めてです。完全に2つの作品のAndroidのSnackbar.make()メソッドの最初の引数

new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      Snackbar.make(mCoordinatorLayout,... 
}} 
new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      Snackbar.make(view,... 
}} 

両方:私はスナックバーの表示について検索している間、私はそれを行うための2種類の方法があります参照してください。なぜ私は理解できませんでしたか? viewはButtonオブジェクトを参照し、mCoordinatorLayoutはCoordinatorLayoutオブジェクトを参照します。それらは異なるオブジェクトですが、Snackbar.make()メソッドの第1引数として2つのうちのいずれかを指定できます。どうして?

完全なソースコードは以下の通りです:

メインレイアウト:

<?xml version="1.0" encoding="utf-8"?> 
<android.support.design.widget.CoordinatorLayout ... > 

<Button 
    android:id="@+id/showSnackbarButton" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_gravity="center" 
    android:text="@string/show_snackbar"/> 

</android.support.design.widget.CoordinatorLayout> 

主な活動:

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    mCoordinatorLayout = (CoordinatorLayout) findViewById(R.id.coordinatorLayout); 

    mShowSnackbarButton = (Button) findViewById(R.id.showSnackbarButton); 
    mShowSnackbarButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      Snackbar.make(mCoordinatorLayout, 
        "This is a simple Snackbar", Snackbar.LENGTH_LONG) 
        .setAction("CLOSE", new View.OnClickListener() { 
         @Override 
         public void onClick(View v) { 
          // Custom action 
          Toast.makeText(MainActivity.this,"this is a toast message", Toast.LENGTH_SHORT).show(); 
         } 
        }).show(); 
     } 
    }); 
} 

答えて

0

あなたが直接CoordinatorLayoutを渡すと、それは避けるに "上がり" になりますCoordinatorLayoutを検索します。だから、いくらかの計算を省くことができます。

ビューを使用すると、ウィンドウのインテリアのコンテンツビューでCoordinatorLayoutまたはフォールバックを検索しようとします。

これは「適切な親」を見つけるために使用されたスナックバーでの方法である:

private static ViewGroup findSuitableParent(View view) { 
    ViewGroup fallback = null; 
    do { 
     if (view instanceof CoordinatorLayout) { 
      // We've found a CoordinatorLayout, use it 
      return (ViewGroup) view; 
     } else if (view instanceof FrameLayout) { 
      if (view.getId() == android.R.id.content) { 
       // If we've hit the decor content view, then we didn't find a CoL in the 
       // hierarchy, so use it. 
       return (ViewGroup) view; 
      } else { 
       // It's not the content view but we'll use it as our fallback 
       fallback = (ViewGroup) view; 
      } 
     } 

     if (view != null) { 
      // Else, we will loop and crawl up the view hierarchy and try to find a parent 
      final ViewParent parent = view.getParent(); 
      view = parent instanceof View ? (View) parent : null; 
     } 
    } while (view != null); 

    // If we reach here then we didn't find a CoL or a suitable content view so we'll fallback 
    return fallback; 
} 
1

それは実際には非常に簡単です。

あなたはSnackbarためのソースコードを見てみると、あなたはSnackbarを作るときをループしView(ビューあなたがそれを与える)を取り、引き続きfindSuitableParentと呼ばれるプライベートメソッドの呼び出しがあることがわかりますCoordinatorLayoutまたはcontentView(画面のすべてを保持するビュー)が見つかるまで、ビュー階層を表示します。

参照:https://android.googlesource.com/platform/frameworks/support/+/refs/heads/master/design/src/android/support/design/widget/Snackbar.java#133

findSuitableParent(View view)が呼び出され

私は;-)

は、この情報がお役に立てば幸い、画面の下から上へSnackbarを移動しなければならなかったプロジェクトのコードをフォークするとき、私はこれを知りました。

関連する問題