当你不向上滚动时,这是whatsapp。工具栏正在显示,下面的tablayout也是如此。
SCREENSHOT1:
一旦你向上滚动它就是whatsapp。您可以看到工具栏已隐藏。
SCREENSHOT2:
有一个指南向您展示如何创建此效果。我已经关注它并在我的应用程序中使用此效果。
https://mzgreen.github.io/2015/06/23/How-to-hideshow-Toolbar-when-list-is-scrolling(part3)/
我的问题是当工具栏显示为 SCREENSHOT1 时显示小吃栏。当我在工具栏显示时尝试显示小吃栏时,它实际显示在屏幕下方,以便用户看不到它。只有当用户向上滚动并隐藏工具栏时,才会显示小吃栏。
我用于我的应用的xml类似于指南https://github.com/mzgreen/HideOnScrollExample/blob/master/app/src/main/res/layout/activity_part_three.xml中使用的xml。我已根据以下链接复制并粘贴了代码:
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/coordinatorLayout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.design.widget.AppBarLayout
android:id="@+id/appBarLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:layout_scrollFlags="scroll|enterAlways" />
<android.support.design.widget.TabLayout
android:id="@+id/tabLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:tabTextColor="@android:color/white"
app:tabSelectedTextColor="@android:color/white"
app:tabIndicatorColor="@android:color/white"
app:tabIndicatorHeight="6dp"/>
</android.support.design.widget.AppBarLayout>
<android.support.v4.view.ViewPager
android:id="@+id/viewPager"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior"/>
<android.support.design.widget.FloatingActionButton
android:id="@+id/fabButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end|bottom"
android:layout_margin="@dimen/fab_margin"
android:src="@drawable/ic_favorite_outline_white_24dp"
app:borderWidth="0dp"
app:layout_behavior="pl.michalz.hideonscrollexample.ScrollingFABBehavior"/>
</android.support.design.widget.CoordinatorLayout>
当工具栏可见时,有没有人知道如何显示小吃吧?
修改
因为布局方案包含tablayouts,并且每个tablayout都显示一个片段,我试图显示每个片段的快餐栏而不是活动级别。我实际上开始认为这可能无法显示每个片段的零食条,这实际上可能需要通过将这3个片段中的每个片段的监听器绑定到主要活动来完成,然后必须只显示小吃栏而在主要活动中。
这是我的一个片段的xml:
<android.support.design.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/snackbarPosition">
<android.support.v4.widget.SwipeRefreshLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/swipeContainer"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.RecyclerView
android:id="@+id/my_recycler_view"
android:layout_below="@+id/join"
android:scrollbars="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
</android.support.v7.widget.RecyclerView>
</RelativeLayout>
</android.support.v4.widget.SwipeRefreshLayout>
</android.support.design.widget.CoordinatorLayout>
答案 0 :(得分:2)
尝试将ViewPager的高度设置为wrap_content
。
CoordinatorLayout应该在不使用match_parent
的情况下检查其尺寸。
此外,请确保您将CoordinatorLayout的后代视图传递给Snackbar.make
。
根据评论进行更新:
Snackbar will walk up the view hierarchy从您提供的视图开始,并将其自身附加到它找到的第一个CoordinatorLayout或窗口装饰的内容视图(如果找不到的话)。
如果你将CoordinatorLayouts嵌套在片段中,你需要确保子CoordinatorLayouts不会溢出它们的容器,这可能很棘手。
在我看来,删除片段中的CoordinatorLayouts可能更容易,而是从片段中提取Snackbar.make
视图。它会愉快地走向层次结构(甚至是片段之外)以到达您活动中的CoordinatorLayout。
如果您这样做,回调将照常工作,但请确保将您用作static
to avoid leaking your fragments的任何回调标记,以防在您的片段消失后Snackbar停留在屏幕上
这可能发生,因为Snackbar将保留对您的回调的引用,而回调又可以保存对您的片段的引用。如果需要对片段或上下文的引用,请使用弱引用。
答案 1 :(得分:2)
非常简单。只需使用viewPager
作为视图即可完成。它看起来像这样:
Snackbar snackbar = Snackbar.make(findViewById(R.id.viewPager), "Your Message", Snackbar.LENGTH_LONG);
snackbar.getView().setBackgroundColor(Color.parseColor("#00b8ba"));
snackbar.show();
确保将findViewById(R.id.viewPager)作为视图传递。
顺便说一句,viewPager
被定义为:
<android.support.v4.view.ViewPager
android:id="@+id/viewPager"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
对于不同的片段使用此(第一个片段):
Snackbar snackbar = Snackbar.make(getView(), "First", Snackbar.LENGTH_LONG);
snackbar.getView().setBackgroundColor(Color.parseColor("#00b8ba"));
snackbar.show();
第二个片段:
Snackbar snackbar = Snackbar.make(getView(), "Second", Snackbar.LENGTH_LONG);
snackbar.getView().setBackgroundColor(Color.parseColor("#00b8ba"));
snackbar.show();
答案 2 :(得分:1)
我设法通过遵循Leo建议将我的活动的coordinatorlayout传入我的片段,然后使用该coordinatorlayout在我的片段中显示我的snackbar来解决这个问题。
所以这就是我在代码中所做的。
这是我的活动代码:
public void setActivityCoordinatorLayout(CoordinatorLayout activityCoordinatorLayout) {
this.activityCoordinatorLayout = activityCoordinatorLayout;
}
在我的片段中,我们获得了对该活动的coordinatorlayout的引用:
Snackbar.make(activityCoordinatorLayout, "No internet", Snackbar.LENGTH_LONG)
.setAction("Retry", new View.OnClickListener() {
@Override
public void onClick(View v) { <YOUR CODE>}}).show();
然后我们将快餐栏设置为针对此活动显示:Coordinatorlayout:
getView
然而,这是一个很长的方法来使代码工作。实际上,更快捷的方法是使用Nilesh的代码和他的var os = require('os');
var path = require('path');
var koa = require('koa');
var fs = require('co-fs');
var parse = require('co-busboy');
var saveTo = require('save-to');
var app = module.exports = koa();
var r = require('rethinkdb')
r.connect()
.then(function(conn) {
app.use(function *(){
// parse the multipart body
var parts = parse(this, {
autoFields: true // saves the fields to parts.field(s)
});
// create a temporary folder to store files
var tmpdir = path.join(os.tmpdir(), uid());
// make the temporary directory
yield fs.mkdir(tmpdir);
// list of all the files
var files = [];
var file;
// yield each part as a stream
var bufs = [];
var part;
while (part = yield parts) {
// filename for this part
files.push(file = path.join(tmpdir, part.filename));
// save the file
// yield saveTo(part, file);
// We are saving into RethinkDB
part.on('data', function(d){ bufs.push(d); });
part.on('end', function(){
var buf = Buffer.concat(bufs);
r.table('user').insert({
file: buf
})
.run(conn)
.then(function(cursor) {
console.log(cursor)
})
})
}
// return all the filenames as an array
// after all the files have finished downloading
this.body = files;
})
})
if (!module.parent) app.listen(3000);
function uid() {
return Math.random().toString(36).slice(2);
}
方法。