小编nat*_*rio的帖子

将BottomSheetBehavior与内部CoordinatorLayout一起使用

v. 23.2引入了设计支持库BottomSheetBehavior,它允许协调员的子节点作为底部工作表(可从屏幕底部拖动​​的视图).

我想做的是作为底层视图,具有以下视图(典型的协调器+折叠的东西):

<CoordinatorLayout
    app:layout_behavior=“@string/bottom_sheet_behavior”>

   <AppBarLayout>
        <CollapsingToolbarLayout>
           <ImageView />
        </CollapsingToolbarLayout>
    </AppBarLayout>

    <NestedScrollView>
        <LinearLayout>
            < Content ... />
        </LinearLayout>
    </NestedScrollView>

</CoordinatorLayout>
Run Code Online (Sandbox Code Playgroud)

不幸的是,底部工作表视图应该实现嵌套滚动,否则它们不会获得滚动事件.如果您尝试使用主活动然后将此视图作为底部工作表加载,您将看到滚动事件仅作用于纸张的"工作表",并且有一些奇怪的行为,您可以看到是否继续阅读.

我很确定这可以通过子类化来处理CoordinatorLayout,甚至可以通过子类化来处理BottomSheetBehavior.你有什么提示吗?

一些想法

  • requestDisallowInterceptTouchEvent() 应该使用,在某些条件下窃取父母的事件:

    • AppBarLayout偏移量> 0时
    • AppBarLayout偏移量是== 0时,我们正在向上滚动(想想它一秒钟,你会看到)
  • 可以通过设置OnOffsetChanged内部应用栏来获得第一个条件;

  • 第二个需要一些事件处理,例如:

    switch (MotionEventCompat.getActionMasked(event)) {
        case MotionEvent.ACTION_DOWN:
            startY = event.getY();
            lastY = startY;
            userIsScrollingUp = false;
            break;
        case MotionEvent.ACTION_CANCEL:
        case MotionEvent.ACTION_UP:
            userIsScrollingUp = false;
            break;
        case MotionEvent.ACTION_MOVE:
            lastY = event.getY();
            float yDeltaTotal = startY - lastY; …
    Run Code Online (Sandbox Code Playgroud)

android ontouchlistener touch-event android-support-library android-support-design

54
推荐指数
1
解决办法
9030
查看次数

在Android Studio中导入drawable的快速方法?

在某个Android项目中,您需要在目录中导入一些drawable - 无论是工具栏图标,图像,UI功能res/drawable.大多数你有规模最常见预选赛(图像时代drawable-hdpi,drawable-mdpi,drawable-xdpi,drawable-xxdpi,...).

因此,我们需要为每个drawable执行三个,四个甚至五个文件复制/粘贴:

external_dir/drawable-mdpi/file.png   ->  my_package/drawable-mdpi/file.png
external_dir/drawable-hdpi/file.png   ->  my_package/drawable-hdpi/file.png
external_dir/drawable-xdpi/file.png   ->  my_package/drawable-xdpi/file.png
external_dir/drawable-xxdpi/file.png  ->  my_package/drawable-xxdpi/file.png
Run Code Online (Sandbox Code Playgroud)

如果您必须导入多个图片,这很烦人.是否有一种简单,快速的方法可以file.png在相应的包文件夹中传输这四个右侧实例?在IDE中实现了一些功能?一些简单的解决方法?

我的工作流程到现在为止:

  • 从OS文件管理器复制/粘贴,从外部目录复制到软件包,然后刷新Android Studio中的资源文件.这意味着打开每个合格的子目录,所以四个动作;
  • 从OS文件管理器,移动到external_dir,搜索file.png,获取单个列表中的四个实例,拖放到Android Studio,然后为每个图片右键单击导航栏Copy,并Paste在相应的包目录中.不是更好!

有什么建议?

编辑 - 我当然不是真的要求"建议" - 我想知道是否有办法将移动次数减少到一个(或者这样).

android android-resources android-studio

51
推荐指数
4
解决办法
9万
查看次数

FloatingActionButton不隐藏

我试图以fabLocation编程方式隐藏我的FloatingActionButton :

fabLocation.setVisibility(View.GONE)
Run Code Online (Sandbox Code Playgroud)

但它不起作用.

如果我添加android:visibility="gone"我的XML布局,fabLocation当我运行我的活动时会隐藏它,但是当我滚动时它会重新出现.

这是我的布局:

<?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/main_content"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true">

<android.support.design.widget.AppBarLayout
    android:id="@+id/appbar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:fitsSystemWindows="true"
    android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">

    <android.support.design.widget.CollapsingToolbarLayout
        android:id="@+id/collapsing_toolbar"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fitsSystemWindows="true"
        app:contentScrim="@color/colorOverlay"
        app:expandedTitleMarginEnd="64dp"
        app:expandedTitleMarginStart="48dp"
        app:layout_scrollFlags="scroll|exitUntilCollapsed">

        <ImageView
            android:id="@+id/img_couverture"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:fitsSystemWindows="true"
            android:scaleType="centerCrop"
            android:src="@drawable/bg_navigation_drawer_header"
            app:layout_collapseMode="parallax" />

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            app:layout_collapseMode="pin"
            app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />

    </android.support.design.widget.CollapsingToolbarLayout>

</android.support.design.widget.AppBarLayout>

<android.support.v4.widget.NestedScrollView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    app:layout_behavior="@string/appbar_scrolling_view_behavior">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <android.support.v7.widget.CardView
            android:layout_marginTop="8dp"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="vertical"
                android:padding="16dp">

                <TextView
                    android:id="@+id/tv_name"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:textSize="18sp" />

                <View …
Run Code Online (Sandbox Code Playgroud)

android material-design floating-action-button android-design-library

40
推荐指数
6
解决办法
4万
查看次数

RecyclerView不滚动并显示所有项目

我在ScrollView中有一个RecyclerView(和一些其他视图).目前,RecyclerView的布局非常小(它显示了它包含的5个中的2个项目)并且它独立于ScrollView滚动,这显然不是很好的用户体验.我想让RecyclerView不滚动和扩展,以便所有项目都可见.

(我知道在这种情况下使用RecyclerView是愚蠢的.我只是这样做,因为应用程序中的其他地方我需要一个普通的RecyclerView滚动等但是同样的内容,我不想重复代码).

android android-recyclerview

37
推荐指数
5
解决办法
4万
查看次数

Android上的工具栏图标着色

我注意到使用AppCompat主题时,默认工具栏图标会被colorControlNormal我的样式中的属性着色.

<style name="MyTheme" parent="Theme.AppCompat">
    <item name="colorControlNormal">@color/yellow</item>
</style>
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

但是,正如您在上面所看到的,所有图标都不会发生这种情况.我提供了"加号"标志,这是我从官方图标中得到的,并没有得到着色(我使用了png的"白色"版本).根据我从这个问题中理解的,系统只显示带有alpha通道的图标.这是真的?

如果是这样的话:有没有可以找到alpha定义的官方素材图标的地方?如果不是 - 并且如果工具栏图标需要仅为alpha设色 - Google如何期望我们在工具栏中使用提供的图标?

在SDK的某个地方,我发现了一些以图标结尾的图标_alpha.png,它们实际上得到了很好的印记.不过,我需要的全套材料图标,并从官方渠道我只能找到white,grey600black人.

ColorFilter在运行时应用会有点痛苦,而我的实际工具栏 - 有些图标有色,有些没有 - 看起来很糟糕.

android android-icons android-5.0-lollipop android-toolbar

34
推荐指数
7
解决办法
3万
查看次数

关于如何从URI获取Exif数据的最终答案

这里已经讨论了很多问题,主要是不同的结果,并且由于API的变化和不同类型的URI,没有明确的答案.

我自己没有答案,但让我们谈谈它.该ExifInterface有一个接受一个构造函数filePath.这本身很烦人,因为现在不鼓励依赖路径 - 你应该使用Uris和ContentResolver.好.

我们的Uri名字uri可以从意图中检索出来onActivityResult(如果您从图库中选择图片ACTION_GET_CONTENT)或者可以是Uri我们之前拥有的(如果您从相机中选择图片并打电话intent.putExtra(MediaStore.EXTRA_OUTPUT, uri)).

API <19

我们uri可以有两种不同的模式:

  • 来自相机的Uris大多都有file://架构.那些很容易治疗,因为他们坚持这条道路.你可以打电话new ExifInterface(uri.getPath()),你就完成了.
  • 来自画廊或其他内容提供商的Uris通常都有一个content://界面.我个人不知道那是什么,但让我发疯.

据我所知,第二种情况应该用ContentResolver你能得到的东西来对待Context.getContentResolver().以下适用于我测试的所有应用程序,无论如何:

public static ExifInterface getPictureData(Context context, Uri uri) {
    String[] uriParts = uri.toString().split(":");
    String path = null;

    if (uriParts[0].equals("content")) {
        // we can use ContentResolver.
        // let’s query the DATA column which …
Run Code Online (Sandbox Code Playgroud)

android uri exif android-intent android-contentresolver

34
推荐指数
3
解决办法
1万
查看次数

片段与我的AppCompat工具栏重叠

我正在使用v7支持库并尝试在左侧安装导航抽屉.在其他地方读到我设置:

  1. DrawerTest.java:一个主要活动,用于保存抽屉,我将工具栏加载到其中setSupportActionBar(),来自自定义的XML布局Toolbar;

  2. toolbar.xml:包含工具栏的XML布局;

  3. activity_drawer_listview.xml:一个DrawerLayoutXML资源,它包含我的片段的容器(一个FrameLayout,<including>即2.中提到的布局)和导航抽屉(一个ListView);

  4. FragmentTest.java:一些非常简单的片段代码,扩展Fragment;

  5. fragment_test_layout.xml:一些非常简单的片段布局,里面只有一个TextView.

我会在这里粘贴一些代码,无论如何我的问题是片段布局似乎从屏幕顶部开始,而不是从底部开始Toolbar.放在5中的任何文本都将与操作栏上的应用程序标题重叠.我哪里错了?

(1.)DrawerTest.java

    public class DrawerTest extends ActionBarCompat {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_drawer_listview);

        DrawerLayout drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
        Toolbar tb = (Toolbar) findViewById(R.id.toolbar_main2);
        ActionBarDrawerToggle abDrawerToggle = new ActionBarDrawerToggle(
                        this, drawerLayout, tb,
                        R.string.navigation_drawer_open,
                        R.string.navigation_drawer_close )
        {
            // onDrawerClosed() { ... }
            // onDrawerOpened() { ... }
        };
        drawerLayout.setDrawerListener(abDrawerToggle);
        setSupportActionBar(tb);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        abDrawerToggle.syncState();

        //code to load …
Run Code Online (Sandbox Code Playgroud)

android android-fragments android-toolbar

33
推荐指数
2
解决办法
4万
查看次数

使用android:elevation在LinearLayout上投射阴影

我有这个LinearLayout将被放置在活动布局的底部.我希望它LinearLayout具有4dp高程,就像顶部工具栏应该具有的那样,但是,因为android:elevation将阴影置于ui组件下方并且此特定组件(linearLayout)将位于屏幕的底部,我将看不到任何高度......

这是我的LinearLayout代码,以及实现默认高程的图像:

    <?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:weightSum="3"
    android:background="@android:color/transparent"
    android:orientation="horizontal"
    android:elevation="4dp"
    android:layout_alignParentBottom="true">

    <ImageButton
        android:id="@+id/playButton"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:scaleType="center"
        android:clickable="true"
        android:background="@drawable/bottom_toolbar_menu_selector"
        android:src="@drawable/ic_play"
        style="?android:attr/borderlessButtonStyle" />

    <ImageButton
        android:id="@+id/stopButton"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:scaleType="center"
        android:clickable="true"
        android:background="@drawable/bottom_toolbar_menu_selector"
        android:src="@drawable/ic_stop"
        style="?android:attr/borderlessButtonStyle" />

    <ImageButton
        android:id="@+id/bookmarkButton"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:scaleType="center"
        android:clickable="true"
        android:background="@drawable/bottom_toolbar_menu_selector"
        android:src="@drawable/ic_bookmark"
        style="?android:attr/borderlessButtonStyle" />

</LinearLayout>
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

有没有办法,使用elevation阴影放在ui组件的顶部? 提前致谢!

android android-layout material-design android-5.0-lollipop

28
推荐指数
1
解决办法
2万
查看次数

如何在Android N多窗口模式下确定正确的设备方向?

多窗口文档:

多窗口模式下禁用的功能

当设备处于多窗口模式时,某些功能被禁用或忽略,因为它们对于可能与其他活动或应用共享设备屏幕的活动没有意义.这些功能包括:

  • 某些系统UI自定义选项已禁用; 例如,如果应用程序未以全屏模式运行,则无法隐藏状态栏.
  • 系统忽略对android:screenOrientation属性的更改.

我得到了大多数应用程序,纵向和横向模式之间的区别是没有意义的,但是我正在使用SDK,其中包含用户可以进行任何活动的摄像机视图 - 包括支持多窗口模式的活动.问题是摄像机视图包含显示摄像机预览的SurfaceView/TextureView,并且为了在所有活动方向上正确显示预览,需要有关正确活动方向的知识,以便可以正确旋转摄像机预览.

问题是我的代码通过检查当前配置方向(纵向或横向)和当前屏幕旋转来计算正确的活动方向.问题是在多窗口模式下,当前配置方向不反映真实的活动方向.这会导致相机预览旋转90度,因为Android报告的配置与方向不同.

我目前的解决方法是检查所请求的活动方向并以此为基础,但有两个问题:

  1. 请求的活动方向不必反映实际的活动方向(即可能仍未满足请求)
  2. 请求的活动方向可以是"后方","传感器","用户"等,它们不会显示有关当前活动方向的任何信息.
  3. 根据文档,在多窗口模式下实际上忽略了屏幕方向,因此1.和2.只是不起作用

即使在多窗口配置中,有没有办法可以稳健地计算正确的活动方向?

这是我目前使用的代码(请参阅有问题的部分的注释):

protected int calculateHostScreenOrientation() {
    int hostScreenOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
    WindowManager wm = (WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE);
    int rotation = getDisplayOrientation(wm);

    boolean activityInPortrait;
    if ( !isInMultiWindowMode() ) {
        activityInPortrait = (mConfigurationOrientation == Configuration.ORIENTATION_PORTRAIT);
    } else {
        // in multi-window mode configuration orientation can be landscape even if activity is actually in portrait and vice versa
        // Try determining from requested orientation (not entirely correct, …
Run Code Online (Sandbox Code Playgroud)

camera android multi-window android-camera android-7.0-nougat

23
推荐指数
1
解决办法
1395
查看次数

CollapsingToolbar无法使用不那么高的内容

我很确定这是一个bug,所以我要求解决方法.我的布局如下:

<CoordinatorLayout>

    <AppBarLayout>
        <CollapsingToolbarLayout>
            <ImageView/>
            <Toolbar/>
        </CollapsingToolbarLayout>
    </AppBarLayout>

    <android.support.v4.widget.NestedScrollView/> <!-- content here -->

</CoordinatorLayout>
Run Code Online (Sandbox Code Playgroud)

我正在从网上检索内容,我不知道它有多高 - 可能是几行,可能很长.但是,我发现CollapsingToolbar当内容不足以覆盖整个屏幕时效果不佳.案例:

  • content.height > screen.height:工作; 滑动顶部/底部展开和折叠工具栏,以及滚动内容;

  • content.height < screen.height:没有.这是不是好,因为大部分的时间(content.height + expandedToolbar.height) > screen.height!

换句话说,当内容不够高时,即使内容+ expandedToolbar比整个屏幕高得多,它也不会对滚动手势做出反应并显示一些错误 - 可能需要十个手势来折叠工具栏一点点.因此,您很难到达内容的底部,因为工具栏已展开,所以内容隐藏在底部.

任何解决方法?

如果你想尝试,只需采取cheesesquare示例项目并删除(或减少)NestedScrollViewactivity_detail.xml中的内容[API17 here]

android android-support-library android-design-library androiddesignsupport

22
推荐指数
1
解决办法
6565
查看次数