- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个“细节” fragment ,它有很多 TextView 、相对布局等。它们被包裹在 NestedScrollView 中:
<android.support.design.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="?android:attr/windowBackground"
android:orientation="vertical"
android:paddingBottom="10dp">
<android.support.v4.widget.NestedScrollView
android:id="@+id/movie_details_scroll"
android:layout_width="match_parent"
android:layout_height="match_parent">
// Here are the textviews, relativelayouts etc...
</android.support.v4.widget.NestedScrollView>
<android.support.design.widget.FloatingActionButton
android:id="@+id/edit_movies_fab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|end"
android:layout_margin="@dimen/fab_margin"
android:src="@drawable/ic_edit_white_24dp"
/>
</android.support.design.widget.CoordinatorLayout>
现在我想在屏幕底部添加一个 FAB(不在 nestedscrollview 的底部),当我滚动浏览 nestedscrollview 时它也会向下滚动。但是在我的代码中,FAB 始终位于嵌套 ScrollView 的底部。所以当我一直向下滚动时,FAB 出现了。我希望 FAB 在右下角始终可见...
编辑
我忘了说我使用了渐变操作栏 ( https://github.com/ManuelPeinado/FadingActionBar ) 但有点编辑。
相关代码:
m_FadingActionBarHelper.createView(getContext()); // this will create the view with header content etc.
创建 View :
public final View createView(LayoutInflater inflater) {
//
// Prepare everything
mInflater = inflater;
if (mContentView == null) {
mContentView = inflater.inflate(mContentLayoutResId, null); // this will load my view which i already posted.
}
if (mHeaderView == null) {
mHeaderView = inflater.inflate(mHeaderLayoutResId, null, false);
}
// See if we are in a ListView, WebView or ScrollView scenario
ListView listView = (ListView) mContentView.findViewById(android.R.id.list);
View root;
if (listView != null) {
root = createListView(listView);
} else if (mContentView instanceof CDMObservableWebViewWithHeader){
root = createWebView();
} else {
root = createScrollView(); // this will be called in my example
}
if (mHeaderOverlayView == null && mHeaderOverlayLayoutResId != 0) {
mHeaderOverlayView = inflater.inflate(mHeaderOverlayLayoutResId, mMarginView, false);
}
if (mHeaderOverlayView != null) {
mMarginView.addView(mHeaderOverlayView);
}
// Use measured height here as an estimate of the header height, later on after the layout is complete
// we'll use the actual height
int widthMeasureSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.EXACTLY);
int heightMeasureSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.EXACTLY);
mHeaderView.measure(widthMeasureSpec, heightMeasureSpec);
updateHeaderHeight(mHeaderView.getMeasuredHeight());
root.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
int headerHeight = mHeaderContainer.getHeight();
if ((!mFirstGlobalLayoutPerformed || (headerHeight != mLastHeaderHeight)) && headerHeight != 0) {
updateHeaderHeight(headerHeight);
mFirstGlobalLayoutPerformed = true;
}
}
});
return root;
}
创建 ScrollView :
private View createScrollView() {
ViewGroup scrollViewContainer = (ViewGroup) mInflater.inflate(R.layout.fab__scrollview_container, null);
CDMObservableScrollView scrollView = (CDMObservableScrollView) scrollViewContainer.findViewById(R.id.fab__scroll_view);
scrollView.setOnScrollChangedCallback(mOnScrollChangedListener);
ViewGroup contentContainer = (ViewGroup) scrollViewContainer.findViewById(R.id.fab__container);
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
mContentView.setLayoutParams(layoutParams);
contentContainer.addView(mContentView);
mHeaderContainer = (FrameLayout) scrollViewContainer.findViewById(R.id.fab__header_container);
initializeGradient(mHeaderContainer);
mHeaderContainer.addView(mHeaderView, 0);
mMarginView = (FrameLayout) contentContainer.findViewById(R.id.fab__content_top_margin);
return scrollViewContainer;
}
将要加载的 xml:
<denis.de.meperdia.fadingactionbar.CDMRootLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<include layout="@layout/fab__header_container"/>
<denis.de.meperdia.fadingactionbar.CDMObservableScrollView
android:id="@+id/fab__scroll_view"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:id="@+id/fab__container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<FrameLayout
android:id="@+id/fab__content_top_margin"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@android:color/transparent"/>
</LinearLayout>
</denis.de.meperdia.fadingactionbar.CDMObservableScrollView>
</denis.de.meperdia.fadingactionbar.CDMRootLayout>
CDMRootLayout 类:
public class CDMRootLayout extends CoordinatorLayout {
private View mHeaderContainer;
private View mListViewBackground;
private boolean mInitialized = false;
public CDMRootLayout(Context context) {
super(context);
}
public CDMRootLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}
public CDMRootLayout(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
//at first find headerViewContainer and listViewBackground
if(mHeaderContainer == null)
mHeaderContainer = findViewById(R.id.fab__header_container);
if(mListViewBackground == null)
mListViewBackground = findViewById(R.id.fab__listview_background);
//if there's no headerViewContainer then fallback to standard FrameLayout
if(mHeaderContainer == null) {
super.onLayout(changed, left, top, right, bottom);
return;
}
if(!mInitialized) {
super.onLayout(changed, left, top, right, bottom);
//if mListViewBackground not exists or mListViewBackground exists
//and its top is at headercontainer height then view is initialized
if(mListViewBackground == null || mListViewBackground.getTop() == mHeaderContainer.getHeight())
mInitialized = true;
return;
}
//get last header and listViewBackground position
int headerTopPrevious = mHeaderContainer.getTop();
int listViewBackgroundTopPrevious = mListViewBackground != null ? mListViewBackground.getTop() : 0;
//relayout
super.onLayout(changed, left, top, right, bottom);
//revert header top position
int headerTopCurrent = mHeaderContainer.getTop();
if(headerTopCurrent != headerTopPrevious) {
mHeaderContainer.offsetTopAndBottom(headerTopPrevious - headerTopCurrent);
}
//revert listViewBackground top position
int listViewBackgroundTopCurrent = mListViewBackground != null ? mListViewBackground.getTop() : 0;
if(listViewBackgroundTopCurrent != listViewBackgroundTopPrevious) {
mListViewBackground.offsetTopAndBottom(listViewBackgroundTopPrevious - listViewBackgroundTopCurrent);
}
}
}
和 CDMObservableScrollView 类:
public class CDMObservableScrollView extends ScrollView implements CDMObservableScrollable {
// Edge-effects don't mix well with the translucent action bar in Android 2.X
private boolean mDisableEdgeEffects = true;
private CDMOnScrollChangedCallback mOnScrollChangedListener;
public CDMObservableScrollView(Context context) {
super(context);
}
public CDMObservableScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public CDMObservableScrollView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
protected void onScrollChanged(int l, int t, int oldl, int oldt) {
super.onScrollChanged(l, t, oldl, oldt);
if (mOnScrollChangedListener != null) {
mOnScrollChangedListener.onScroll(l, t);
}
}
@Override
protected float getTopFadingEdgeStrength() {
// http://stackoverflow.com/a/6894270/244576
if (mDisableEdgeEffects && Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) {
return 0.0f;
}
return super.getTopFadingEdgeStrength();
}
@Override
protected float getBottomFadingEdgeStrength() {
// http://stackoverflow.com/a/6894270/244576
if (mDisableEdgeEffects && Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) {
return 0.0f;
}
return super.getBottomFadingEdgeStrength();
}
@Override
public void setOnScrollChangedCallback(CDMOnScrollChangedCallback callback) {
mOnScrollChangedListener = callback;
}
}
编辑 2
我现在可以划定问题了:
如果我使用这些行,FAB 将按照我的意愿工作:
<denis.de.meperdia.fadingactionbar.CDMObservableScrollView
android:id="@+id/fab__scroll_view"
android:layout_width="match_parent"
android:layout_height="match_parent">
但随后我的淡入淡出操作栏的同步被破坏了......
抱歉,代码太多了,但如果没有这个,理解起来真的很复杂。
最佳答案
导入app
命名空间,用RelativeLayout
包围NestedScrollView
,然后将RelativeLayout
设置为
。FAB
的 anchor
<android.support.design.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" //Import app namespace
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="?android:attr/windowBackground"
android:orientation="vertical"
android:paddingBottom="10dp">
<android.support.v4.widget.NestedScrollView
android:id="@+id/mainview"
android:layout_width="match_parent"
android:layout_height="match_parent">
// Here are the textviews, relativelayouts etc...
</android.support.v4.widget.NestedScrollView>
<android.support.design.widget.FloatingActionButton
android:id="@+id/edit_movies_fab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="@dimen/fab_margin"
android:src="@drawable/ic_edit_white_24dp"
app:layout_anchor="@id/mainview" //attributes of app namespace
app:layout_anchorGravity="bottom|end"
/>
</android.support.design.widget.CoordinatorLayout>
关于android - FAB 结合 NestedScrollView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43719011/
所以我有一个 Fragment,它使用 CoordinatorLayout,里面有一个 NestedScrollView。 NestedScrollView 内部是一个 ViewPager。 View
我知道这个问题很多,但我尝试了几乎所有的解决方案,即使是神奇的解决方案显然对我不起作用!:(父级是 NestedScrollview,在子级中还有另一个嵌套 ScrollView ) pare
我想在滚动式 Instagram 时将 TabLayout 固定在顶部。有没有办法在 NestedScrollView 中执行此操作? NestedScrollView -- ConstraintLa
我的构造中有两个项目,一个是静态项目,另一个是带有可拖动项目的回收 View 。两种类型的 View 都由 LinearLayout 包装。 LinearLayout 由 NestedScrollVi
java.lang.NoSuchMethodError: No virtual method setOnScrollChangeListener(Landroidx/core/widget/Neste
我有一个带有RecyclerView的PagedListAdapter。 当我将RecyclerView放入NestedScrollView中时,PagedList无法计算列表的末尾,因此start请
我将 CollapsingToolbarLayout 与 NestedScrollView 结合使用,在 NestedScrollView 内我有一个项目列表,但在执行中我无法滚动所有项目。 在我的示
我试图将后退按钮保留在页面底部,并让嵌套 ScrollView 填充页面底部统计信息相对布局和后退按钮下方的空间。它目前适合顶部的统计信息,但由于它适合页面,所以将后退按钮推离了页面底部。
所以我在 styles.xml 中为 AppTheme NoActionBar 设置,因为我只希望在几个 Activites 中使用工具栏,并且我还创建了包含两个项目的 post_details_me
这是我 Activity 中的原始布局: 看起来不错: 内容布局文件包含一个 TableLayout。 由于内容可能很长,我添加了一个 Neste
我使用 https://github.com/nhaarman/ListViewAnimations实现拖放,滑动删除等。但是有问题第一个图像可以滚动列表但不能拖放(它下降到相同的位置并且不进入onI
我在 CoordinatorLayout 中有一个 NestedScrollView。在 NestedScrollView 中,我有一个包含一些组件的 LinearLayout,其中一些是按钮。组件没
我注意到 CoordinatorLayout 内的 NestedSCrollView 中的内容如果没有填满整个屏幕,则始终对齐在底部。我该如何解决? 我的代码:
我正在使用 NestedScrollView 以达到某些目的 similar to this . 更新 这是我的 repo . 我发现当移动设备变成横向滚动时,我无法看到按钮或底部的灰色 View 。
我似乎找不到 nestedScrollView 的选项使其水平而不是垂直。我一直在使用 HorizontalScrollView 但我想切换到嵌套。有没有办法做到这一点?搜索文档我没有看到它,但它
我的 xml 由一个约束布局组成。这里面有 2 个按钮和 1 个嵌套的 ScrollView 。 ScrollView 中有各种元素,包括回收 View 。我希望回收 View 不滚动,而只滚动嵌套的
我在 NestedScrollview 中有一个 Recyclerview.. 一切正常,除了一个 thig。我在 NestedScrollview 中共有三个 View ,前两个是 LinearLa
我在我的 fragment 中使用 NestedScrollView。在我的 xml 中的 RelativeLayout 但它没有覆盖整个屏幕高度。 下面是我的代码 - 运行代码时,只有黑色
在我的应用程序中,我需要复杂的 ScrollView 。作为垂直列表和动画标题中的水平列表。下面的代码是一个极简示例,可以使我的问题在 iOS 设备上重现。 我在 flutter 中遇到嵌套 Scro
我正在使用带有标题图像的 CoordinatorLayout 制作详细 View ,我想在具有 NestedScrollView 的 View 中应用圆角边缘,如下所示: 我正在使用带有标题图像的 C
我是一名优秀的程序员,十分优秀!