小编nat*_*rio的帖子

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
查看次数

RecyclerView和Adapter数据更新

对于了解其机制或愿意深入了解源代码的人来说,这是一个关于RecyclerView内部行为的问题.我希望通过对源代码的引用来支持答案.

原始问题

(向下滚动到'换句话说'以获得更集中的问题)

我需要了解notify*行为(例如notifyItemInserted())是如何排队的.想象一下,我有一个由此列表备份的适配器:

ArrayList<String> list = Arrays.asList("one", "three", "four");
Run Code Online (Sandbox Code Playgroud)

我想补充的价值观zerotwo,即失踪.

例1

list.add(1, "two");
// notify the view
adapter.notifyItemInserted(1);


// Seconds later, I go on with zero
list.add(0, "zero");
// notify the view
adapter.notifyItemInserted(0);
Run Code Online (Sandbox Code Playgroud)

这非常简单明了,无话可说.

例2

但是,如果两个动作彼此非常接近,并且两者之间没有布局传递怎么办?

list.add(1, "two");
list.add(0, "zero”);
Run Code Online (Sandbox Code Playgroud)

我现在应该怎么做?

adapter.notifyItemInserted(1);
adapter.notifyItemInserted(0);
Run Code Online (Sandbox Code Playgroud)

或者可能

adapter.notifyItemInserted(2);
adapter.notifyItemInserted(0);
Run Code Online (Sandbox Code Playgroud)

?从适配器的角度来看,列表立即切换one, three, fourzero, one, two, three, four第二个选项似乎更合理.

例3

list.add(0, “zero”);
adapter.notifyItemInserted(0);
list.add(2, “two”);
adapter.notifyItemInserted(...)
Run Code Online (Sandbox Code Playgroud)

现在怎么样?1还是2?该列表之后立即更新,但我确信它们之间没有布局传递.

你遇到了主要问题,我想知道在这些情况下我应该怎么做.真实情况是我有多个异步任务以一个 …

android recycler-adapter android-recyclerview

22
推荐指数
2
解决办法
7576
查看次数

隐藏AppBarLayout并将其空间分配给剩余视图

我使用新的设计库有一个非常标准的布局:

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

<android.support.v4.widget.NestedScrollView/> <!-- content here -->
Run Code Online (Sandbox Code Playgroud)

我想要做的是完全隐藏整个AppBarLayout程序,暂时摆脱Toolbar它及其崩溃功能.

所以我称之为:

private void disableCollapsing() {
    AppBarLayout.LayoutParams p = (AppBarLayout.LayoutParams) collapsingToolbarLayout.getLayoutParams();
    p.setScrollFlags(0);
    collapsingToolbarLayout.setLayoutParams(p);
}
Run Code Online (Sandbox Code Playgroud)

禁用折叠行为(效果很好),最后这个:

@Override
public void hide() {
    final AppBarLayout layout = (AppBarLayout) findViewById(R.id.appbar);

    layout.animate().translationY(-layout.getHeight())
            .setListener(new AnimatorListenerAdapter() {
                @Override
                public void onAnimationEnd(Animator animation) {
                    super.onAnimationEnd(animation);
                    layout.setVisibility(View.GONE);
                }
            }).start();
}
Run Code Online (Sandbox Code Playgroud)

我将AppBarLayout转换为顶部(工作顺利),并且在动画集的末尾是可见性View.GONE.

问题

在动画结束时,无论我是否也将可见性设置为GONE,我都无法获得之前占用的空间AppBarLayout.我的NestedScrollView仍然局限在屏幕的下半部分,好像AppBarLayout仍在那里(不是).我该如何解决?

隐藏之前:

之前

隐藏后(AppBar翻译到顶部):

后

如您所见,顶部空间是空的,无法访问.滚动视图在其之前的边距内滚动,就好像可见性变化不是由CoordinatorLayout.

  • 我试过打电话coordinator.requestLayout(),没有成功.

  • 我也尝试将AppBarLayout设置app:anchor为我的NestedScrollView,但这会搞砸 - 滚动视图最终会在隐藏之前占据整个屏幕.

  • 我想Behavior在进入这个 …

android android-layout android-design-library android-coordinatorlayout

17
推荐指数
1
解决办法
8956
查看次数

如何管理PreferenceFragment中的分隔符?

我开始处理a中的偏好PreferenceFragment.这就是我所拥有的:

my_preferences

我试着:

  1. 摆脱物品之间的分隔物.我想这可以从样式中定义,但我无法弄清楚如何.我尝试ListView在运行时调用 获取首选项findViewById(android.R.id.list),因为我在某处读取,但它返回null.

  2. 设置新的,全宽有权在头顶部分隔,如看到这里.例如,在这种情况下,我想在"Statistiche"上方的全宽度分隔符,但不在列表顶部的"Generali"之上.

我想到的唯一方法是将分隔线设置为假偏好,例如:

<Preference
    android:layout="@layout/divider" //here I set width and a divider resource
    />

<PreferenceCategory ... />
Run Code Online (Sandbox Code Playgroud)

这里的主要问题是我的PreferenceFragment(或者ActionBarActivity它的)有一些左/右填充,这使得我添加到preferences.xml中的任何分隔符都不会覆盖整个宽度.

所以我的问题是:

  • 如何摆脱图片中可以看到的默认项目分项?

  • 如何在标题上方设置全宽分隔符,或者如何摆脱内部片段/活动填充?当然,我的活动布局没有任何(显式)填充.

android android-preferences android-listview android-fragments

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

如何以编程方式更改card_view:cardCornerRadius

在我的项目中,我RecyclerView在我的列表中使用CardView.在我的列表中,我必须CardView根据设备动态设置角半径.

有没有办法动态设置cardview转角半径值?

谢谢.

android cornerradius android-cardview cardview

16
推荐指数
1
解决办法
9243
查看次数

我怎么知道onCreateView是从外部类调用的?

我真的很好奇如何确定(来自外部类)是否onCreateView()已经调用了一个片段.我搜索过类似的问题但没有找到.

例如,是fragment.isAdded()一个很好的指标?

我的第一个想法很简单fragment.getView() != null,但我并不是100%肯定它看起来是可靠的,而且我也不太愿意使用它(没有特别的原因,我只是倾向于避免无效检查).我很乐意找到一个解决方法.我的建议:

被添加()

如果片段当前已添加到其活动,则返回true.

在我看来,这条线很模糊; 添加没有附加,但都没有创建.它可能是指FragmentTransaction.add()(这在语义上是错误的,因为你可以<fragment>在你的布局中卡住而不必调用addreplace).

尽管如此,FragmentTransaction.add() 文档没有提供信息也没有让你思考added -> created.我会说不.

ISVISIBLE()

如果片段当前对用户可见,则返回true.这意味着:(1)已添加,(2)其视图附加到窗口,(3)未隐藏.

在某种意义上看起来很好,isVisible() -> isCreated但第三种选择使它成为现实isCreated != isVisible.我只想到一个视图分页器中的片段:并非所有片段都可见,但是当前可见片段附近的片段被添加,创建和存活,您可以调用它们上的方法.但对他们来说,isVisible() == false.这有点太严格了.

isInLayout()

如果布局通过<fragment>标记包含在活动视图层次结构中,则返回true.当通过<fragment>标记创建片段时,这将始终为真,除非旧片段从先前状态恢复且未出现在当前状态的布局中.

我不认为这适用于此.

getView()!= null

返回片段的根视图,如果没有布局,则返回null.

这看起来仍然是唯一的解决方案.我只想确认一下.

实现回调

..被称为onCreateView()或更好onViewCreated().但:

  • 片段创建后我不需要调用某些东西(为什么需要它?),我需要在给定时间检查一些东西;
  • 一个人应该定义相反的,例如onViewNotAvailableAnymore(),以使检查始终有意义;
  • 我不知道这会有什么不同,或者更好getView != null.

android android-lifecycle android-fragments android-activity

13
推荐指数
2
解决办法
3081
查看次数

即时运行比标准版本更长

现在已经有一段时间了,Instant Run不再工作了,也就是说,它比标准版本慢.

AOSP错误跟踪器中有一些材料,但我无法解决这个问题.我相信你们中的一些人会有所帮助.

没有即时运行

建设大约需要1.30分钟.

使用即时运行

我第一次运行应用程序,然后应用一些小的更改.例如,更改int a = 1int a = 2方法内部或更改字符串.

然后再次单击运行.怎么了:

  • 看起来完全构建(调用assembleDebug我的所有模块).大约需要1.30分钟.
  • 第二轮继续,只是打电话app:assembleDebug.大约需要一分钟:

    16:27:10 Executing tasks: [:app:assembleDebug]
    16:28:16 Gradle build finished in 1m 5s 264ms
    16:28:22 Instant Run applied code changes and restarted the app.
    
    Run Code Online (Sandbox Code Playgroud)

在第一轮中,没有任何输出到事件日志或Gradle控制台.在第二轮中,Gradle控制台会输出大量内容并以此结束

BUILD SUCCESSFUL

Total time: 51.385 secs
PREDEX CACHE HITS:   0
PREDEX CACHE MISSES: 45
Stopped 0 compiler daemon(s).
Run Code Online (Sandbox Code Playgroud)

我能做什么?

我在我的grade.properties文件中有这些:

org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
org.gradle.parallel=true
org.gradle.daemon=true
Run Code Online (Sandbox Code Playgroud)

build.gradle文件中没有与dex相关的内容.不使用杰克.Android Studio 2.2.3.


gradle.properties文件 …

android android-studio android-instant-run

13
推荐指数
1
解决办法
1250
查看次数

使用AppCompat将Material外观置于Preferences的最佳实践?

使用AppCompat将Material Design设置为首选项的最佳方法是什么?我一直在阅读一些问题,主要观点似乎是:

  • 官方指南 建议避免PreferenceActivity,如果工作了API> 11(和我).相反,应该使用PreferenceFragments;

  • 使用PreferenceActivity将是坏还因为你不能既延长PreferenceActivityActionBarActivity;

  • 您可以使用常规ActionBarActivity并加载PreferenceFragment(API> 11).这样,从资源加载的首选项小部件被AppCompat着色,但对于任何小部件都不是这样(参见此处);

  • 无论如何,使用建议的解决方案,即使从AppCompat主题继承,整个UI外观也不完全是Material(请参阅Android 4.2上的图像).

  • 另一种方法是扩展PreferenceActivity(API> 1).如上所述,您不会扩展ActionBarActivity,只是继承AppCompat主题.

  • 最后,您可以自己扩展Activity ActionBarActivity,并自行处理小部件,布局,边距,SharedPreferences.

目前我不知道有效的解决方案.我在Chris Banes的帖子中看到了一些介绍材料的讨论,但没有提出任何解决方案.我在问:

  • 你们中的一些人是否成功地为偏好带来了纯粹(尽可能)的材质外观,以及如何?
  • 将来有关此问题的v7会有所改进吗?

android android-preferences material-design

12
推荐指数
1
解决办法
4035
查看次数

FloatingActionButton setVisibility()不起作用

我无法隐藏我的FloatingActionButton.这是我的代码:

XML:

<CoordinatorLayout>

    <AppBarLayout android:id="@+id/appbar">

        <CollapsingToolbarLayout>

            <ImageView/>

            <android.support.v7.widget.Toolbar />

        </CollapsingToolbarLayout>

    </AppBarLayout>

    <NestedScrollView />

    <android.support.design.widget.FloatingActionButton
        android:id="@+id/fab"
        app:layout_anchor="@id/appbar"
        app:layout_anchorGravity="bottom|right|end"/>

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

我打电话给:

fab.clearAnimation();
fab.setVisibility(View.GONE);
Run Code Online (Sandbox Code Playgroud)

我试图隐藏FAB,但似乎setVisibility+ clearAnimation如果FAB在a中则不起作用CoordinatorLayout.

即使我打电话fab.clearAnimation,动画仍然会被触发.谁能帮我?

android android-support-library material-design android-design-library

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

CollapsingToolbarLayout setTitle()不再工作

setTitle()方法CollapsingToolbarLayout已经有一些错误(如只在滚动后显示,固定v22.2.1).

今天我更新了v23.0.0,它根本就没有用,就像没有显示标题一样.通过延迟多次调用它,我可以看到有时标题就在那里,但它确实不可靠(比如,你切换到另一个片段,然后回到第一个,并且不再有标题).

我发现有一个新属性,app:titleEnabled或者CollapsingToolbarLayout.setTitleEnabled(boolean).我已将两者都设置为true,但实际上并没有改变任何东西.

你们中的任何一个人都有同样的行为吗?

我想知道市场上有多少应用程序正在使用这个设计库,它已经从第一个版本充满了错误并且没有变得更好.

编辑

通过进一步的测试,似乎(我不是100%肯定)它连接到新的AppBarLayout.setExpanded()api.

如果我打电话:

collapsingToolbar.setTitle("title");
Run Code Online (Sandbox Code Playgroud)

它有效,但如果我打电话

collapsingToolbar.setTitle("title");
appbarLayout.setExpanded(true, true);
//OR
appbarLayout.setExpanded(true, true);
collapsingToolbar.setTitle("title");
Run Code Online (Sandbox Code Playgroud)

它没有 - 没有标题显示.同样setExpanded(false, true),即试图折叠工具栏.

Edit2(2015年9月)

好吧,不.即使我从不打电话abl.setExpanded()或问题,这个问题仍然存在app:expanded.此外,我们现在在v23.0.1上,但仍未解决.看起来我们中只有少数人正在体验它,因为我在这里找不到任何东西,也没有在官方的bug列表中找到.我在这里提交了一个错误.

android android-support-library android-design-library

12
推荐指数
2
解决办法
6057
查看次数