web-dev-qa-db-ja.com

Android SnackBarを画面上の特定の位置に調整する方法

新しいAndroidスナックバーに続いて、特定のy座標に配置するように設定しようとしています。それは不可能なようです。

スナックバーのビューの親を取得しようとしましたが、親に位置を設定するために親に行うことは何もありません。

mSnackBar.getView().getParent();

実際のクラスを掘り下げると、mViewのインスタンスと、プライベートであり、どうしても到達できないmParentがあります。

https://developer.Android.com/reference/Android/support/design/widget/Snackbar.html

18
Dus

既存のアクティビティレイアウト内に_Android.support.design.widget.CoordinatorLayout_を配置することにより、スナックバーが表示される場所を設定することができます。

たとえば、既存のレイアウトがRelativeLayoutである場合、次のようにCoordinatorLayoutを追加できます。

_<Android.support.design.widget.CoordinatorLayout
    Android:layout_width="match_parent"
    Android:layout_height="200dp"
    Android:id="@+id/myCoordinatorLayout"
    Android:layout_alignParentTop="true"
    Android:layout_alignParentLeft="true"
    Android:layout_alignParentStart="true">
</Android.support.design.widget.CoordinatorLayout>
_

次に、Snackbar.make()コマンドの最初の引数としてCoordinatorLayoutを渡すようにしてください。

_final View viewPos = findViewById(R.id.myCoordinatorLayout);    
Snackbar.make(viewPos, R.string.snackbar_text, Snackbar.LENGTH_LONG)
                            .setAction(R.string.snackbar_action_undo, showListener)
                            .show();
_

これにより、make()関数に提供されるCoordinatorLayoutの-​​bottomにSnackbarが表示されます。

ViewではないCoordinatorLayoutを渡すと、スナックバーはCoordinatorLayoutまたはレイアウトのルートが見つかるまでツリーをたどります。

52
BrentM

Snackbarのレイアウトを明示的に定義することは、常に実用的ではない場合があります。

この問題は、スナックバーではなく、親をターゲットにしているようです。

Snackbar snackbar = Snackbar.make(layout, message, duration);
View snackbarLayout = snackbar.getView();
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
    LinearLayout.LayoutParams.WRAP_CONTENT, 
    LinearLayout.LayoutParams.WRAP_CONTENT
);
// Layout must match parent layout type
lp.setMargins(50, 0, 0, 0);
// Margins relative to the parent view.
// This would be 50 from the top left.
snackbarLayout.setLayoutParams(lp);
snackbar.show();
4
Abandoned Cart