新しいAndroidスナックバーに続いて、特定のy座標に配置するように設定しようとしています。それは不可能なようです。
スナックバーのビューの親を取得しようとしましたが、親に位置を設定するために親に行うことは何もありません。
mSnackBar.getView().getParent();
実際のクラスを掘り下げると、mViewのインスタンスと、プライベートであり、どうしても到達できないmParentがあります。
https://developer.Android.com/reference/Android/support/design/widget/Snackbar.html
既存のアクティビティレイアウト内に_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
またはレイアウトのルートが見つかるまでツリーをたどります。
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();