android - 折叠/展开工具栏仅在双击时使用工具栏未覆盖的框架布局
问题描述
对于我现有的应用程序,我想要以下更改:
- 默认情况下,工具栏/应用栏是可见的。FrameLayout 的内容从工具栏下方开始。因此,工具栏不会覆盖任何框架布局。
- 在用户操作时,例如通过双击,工具栏/应用程序栏应该折叠。Framelayout 应该延伸到页面的顶部。
- 滚动框架布局的内容时不需要折叠工具栏/应用程序栏。
我怎样才能得到这种行为?到目前为止,我面临以下问题:1当我滚动 FrameLayout 时工具栏/应用程序栏崩溃,并且框架布局的 [2] 部分被工具栏/应用程序栏覆盖。
这是我的代码:
<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true">
<android.support.design.widget.CoordinatorLayout
android:id="@+id/coordinatorLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<android.support.design.widget.AppBarLayout
android:id="@+id/appbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:fitsSystemWindows="true">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:itemIconTint="#333"
app:itemTextColor="#333"
app:layout_collapseMode="pin"
app:layout_scrollFlags="scroll|enterAlways"
app:popupTheme="@style/ThemeOverlay.AppCompat.Dark"
app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"/>
</android.support.design.widget.AppBarLayout>
<FrameLayout
android:id="@+id/content_frame"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
<!-- see this line above. The string is defined below -->
</android.support.design.widget.CoordinatorLayout>
<android.support.design.widget.NavigationView
android:id="@+id/left_drawer"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
app:headerLayout="@layout/nav_header"
app:menu="@menu/navigation_drawer_items"
app:itemIconTint="#fcc"
app:itemTextColor="#000" />
</android.support.v4.widget.DrawerLayout>
布局字符串是:
<string name="appbar_scrolling_view_behavior" translatable="false">android.support.design.widget.AppBarLayout$ScrollingViewBehavior</string>
解决方案:
您可以在下面找到Rabee创建的出色解决方案。学分和赏金学分是他的!
基于该解决方案,我创建了一个简单的 Git 项目,可以轻松显示所有手势。双击指定内容将展开或折叠工具栏。单击工具栏将折叠工具栏。
享受使用 AndroidX 和 JDK8的Git 演示项目。
解决方案
尝试以下操作(下面代码中的 activity_main.xml 是您发布的布局):
1)MainActivity.class:
public class MainActivity extends AppCompatActivity implements
GestureDetector.OnGestureListener,
GestureDetector.OnDoubleTapListener{
private final String TAG = MainActivity.class.getSimpleName();
private GestureDetector gestureDetector;
private AppBarLayout appbar;
private Toolbar toolbar;
private FrameLayout content_frame;
private TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
gestureDetector = new GestureDetector(MainActivity.this, MainActivity.this);
appbar = (AppBarLayout) findViewById(R.id.appbar);
toolbar = (Toolbar) findViewById(R.id.toolbar);
content_frame = (FrameLayout) findViewById(R.id.content_frame);
LayoutInflater inflater = (LayoutInflater) MainActivity.this.getSystemService(LAYOUT_INFLATER_SERVICE);
View framelayout_content = inflater.inflate(R.layout.framelayout_content, null, false);
content_frame.addView(framelayout_content);
tv = (TextView) findViewById(R.id.tv);
tv.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
appbar.setExpanded(true);
}
});
toolbar.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
MainActivity.this.gestureDetector.onTouchEvent(motionEvent);
return false;
}
});
}
@Override
public boolean onSingleTapConfirmed(MotionEvent motionEvent) {
return false;
}
@Override
public boolean onDoubleTap(MotionEvent motionEvent) {
appbar.setExpanded(false);
return true;
}
@Override
public boolean onDoubleTapEvent(MotionEvent motionEvent) {
return true;
}
@Override
public boolean onDown(MotionEvent motionEvent) {
return true;
}
@Override
public void onShowPress(MotionEvent motionEvent) {
}
@Override
public boolean onSingleTapUp(MotionEvent motionEvent) {
return false;
}
@Override
public boolean onScroll(MotionEvent motionEvent, MotionEvent motionEvent1, float v, float v1) {
return false;
}
@Override
public void onLongPress(MotionEvent motionEvent) {
}
@Override
public boolean onFling(MotionEvent motionEvent, MotionEvent motionEvent1, float v, float v1) {
return false;
}
}
2)framelayout_content.xml:
<?xml version="1.0" encoding="utf-8"?>
<ScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/colorPrimaryDark"
android:fillViewport="true"
android:scrollbars="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<View
android:layout_width="match_parent"
android:layout_height="10dp"
android:background="@color/colorAccent">
</View>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Content"
android:textSize="30sp"
android:textColor="@android:color/white"
android:gravity="center"
android:padding="50dp"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Content"
android:textSize="30sp"
android:textColor="@android:color/white"
android:gravity="center"
android:padding="50dp"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Content"
android:textSize="30sp"
android:textColor="@android:color/white"
android:gravity="center"
android:padding="50dp"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Content"
android:background="@color/colorAccent"
android:textSize="30sp"
android:id="@+id/tv"
android:textColor="@android:color/white"
android:gravity="center"
android:padding="50dp"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Content"
android:textSize="30sp"
android:textColor="@android:color/white"
android:gravity="center"
android:padding="50dp"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Content"
android:textSize="30sp"
android:textColor="@android:color/white"
android:gravity="center"
android:padding="50dp"/>
</LinearLayout>
</ScrollView>
3) 结果:
推荐阅读
- python - 需要根据csv文件python中的列数创建多个变量
- pytorch - 如何张量多个 3D 关键点的损失
- sql - MS-Access SQL 多级自联接
- vue.js - Send props to frameworkComponents (ag-grid) with Vue
- javascript - TypeError:rules.map 不是函数 - React js
- c - Linux 上的堆栈开始
- cassandra - 即使条件匹配,ansible 条件语句也会跳过剧本
- linux - Linux sendmail命令在cron中不发送邮件
- scikit-learn - 对 BaggingClassifier 参数内的参数进行网格搜索
- jquery - 如何始终将元素放在第一个位置?