小编foo*_*o64的帖子

RecyclerView GridLayoutManager:如何自动检测跨度计数?

使用新的GridLayoutManager:https://developer.android.com/reference/android/support/v7/widget/GridLayoutManager.html

它需要一个明确的跨度计数,所以问题现在变成:你怎么知道每行有多少"跨度"?毕竟这是一个网格.根据测量的宽度,RecyclerView可以容纳多个跨距.

使用旧的GridView,您只需设置"columnWidth"属性,它将自动检测适合的列数.这基本上是我想要为RecyclerView复制的:

  • 在上添加OnLayoutChangeListener RecyclerView
  • 在此回调中,膨胀单个"网格项"并进行测量
  • spanCount = recyclerViewWidth/singleItemWidth;

这似乎是很常见的行为,所以有一种我没有看到的更简单的方法吗?

android android-gridlayout gridlayoutmanager android-recyclerview

101
推荐指数
6
解决办法
8万
查看次数

Android FragmentTabHost - 尚未完全出炉?

我想看看是否有人使用新的Android API级别17附带的FragmentTabHost自定义选项卡.

我很高兴能够在我的ViewPager SherlockFragments中嵌入一个tabHost,但是我很难做一些简单的事情,例如将标签移动到底部或更改标签的布局.

有谁见过使用这个功能的好例子?

这是我在Android文档中找到的唯一示例,而且几乎没有任何描述它的用法.它似乎也忽略了布局中定义的内容R.id.fragment1.

我想我的问题是,如果有人遇到过一个很好的教程:FragmentTabHost或者他们是否知道如何a)将嵌套标签置于底部或b)更改所述标签的布局.

我已经尝试了所有常用方法,但由于看起来XML布局文件被覆盖,我没有太多运气.

private FragmentTabHost mTabHost;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {

    setContentView(R.layout.fragment_tabs);
    mTabHost = (FragmentTabHost)findViewById(android.R.id.tabhost);
    mTabHost.setup(this, getSupportFragmentManager(), R.id.realtabcontent);

    mTabHost.addTab(mTabHost.newTabSpec("simple").setIndicator("Simple"),
            FragmentStackSupport.CountingFragment.class, null);
    mTabHost.addTab(mTabHost.newTabSpec("contacts").setIndicator("Contacts"),
            LoaderCursorSupport.CursorLoaderListFragment.class, null);
    mTabHost.addTab(mTabHost.newTabSpec("custom").setIndicator("Custom"),
            LoaderCustomSupport.AppListFragment.class, null);
    mTabHost.addTab(mTabHost.newTabSpec("throttle").setIndicator("Throttle"),
            LoaderThrottleSupport.ThrottledLoaderListFragment.class, null);

    return mTabHost;
}
Run Code Online (Sandbox Code Playgroud)

在做了一些研究后,似乎可能会在支持库中初始化FragmentTabHost时出现故障.Google代码上的用户提供了以下建议:

FragmentTabHost.java

private void initFragmentTabHost(Context context, AttributeSet attrs) {
    TypedArray a = context.obtainStyledAttributes(attrs,
            new int[] { android.R.attr.inflatedId }, 0, 0);
    mContainerId = a.getResourceId(0, 0);
    a.recycle();

    super.setOnTabChangedListener(this);

    // If owner hasn't made its own …
Run Code Online (Sandbox Code Playgroud)

java android android-tabhost android-fragments

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

Android NDK调试:armeabi-v7a无法正常工作

Eclipse/Cygwin

NDK 8c

构建共享库

切换到armeabi-v7a后,我无法启动gdbserver.我在网上搜索了几个小时,但找不到专门处理armeabi-v7a调试问题的话题.

由于使用依赖于它的第三方库,我无法切换到armeabi-v7a.没有它,我会遇到这些错误:

D:\TEMP\ccnnGAqD.s:10427: Error: selected processor does not support Thumb mode `ldrex r6,[r3]'
D:\TEMP\ccnnGAqD.s:10429: Error: selected processor does not support Thumb mode `strex r4,r5,[r3]'
Run Code Online (Sandbox Code Playgroud)

使用此设置之前,使用'armeabi'之前一切正常:http://mhandroid.wordpress.com/2011/01/23/using-eclipse-for-android-cc-development/

我做的唯一更改是将其添加到Application.mk:

APP_ABI := armeabi-v7a
Run Code Online (Sandbox Code Playgroud)

在Android.mk共享库的最底部,我添加了这个:

$(info TARGET_ARCH     = $(TARGET_ARCH))
$(info TARGET_ARCH_ABI = $(TARGET_ARCH_ABI))
$(info TARGET_ABI      = $(TARGET_ABI))
Run Code Online (Sandbox Code Playgroud)

输出以下内容:

TARGET_ARCH     = arm
TARGET_ARCH_ABI = armeabi-v7a
TARGET_ABI      = android-14-armeabi-v7a
Run Code Online (Sandbox Code Playgroud)

我已经卸载了应用程序

adb uninstall com.example.game
Run Code Online (Sandbox Code Playgroud)

AndroidManifest.xml确实有android:debuggable ="true"属性.

在Eclipse中完成"全部清理",并手动删除./libs和./obj文件夹.然后,ndk-build输出到右侧文件夹(obj/local/armeabi-v7a和libs/armeabi-v7a),并且obj/local/armeabi和libs/armeabi 不存在.

但是,这是我运行ndk-gdb时会发生的事情:

user@MACHINENAME /cygdrive/e/projects/game
$ ndk-gdb-eclipse --force --verbose
Android NDK installation path: /cygdrive/e/projects/sdks/android-ndk
Using default …
Run Code Online (Sandbox Code Playgroud)

eclipse debugging android cygwin android-ndk

8
推荐指数
1
解决办法
8880
查看次数

android NDK mutex locking

I've been porting a cross platform C++ engine to Android, and noticed that it will inexplicably (and inconsistently) block when calling pthread_mutex_lock. This engine has already been working for many years on several platforms, and the problematic code hasn't changed in years, so I doubt it's a deadlock or otherwise buggy code. It must be my port to Android..

So far there are several places in the code that block on pthread_mutex_lock. It isn't entirely reproducible either. When it …

android mutex pthreads android-ndk

5
推荐指数
1
解决办法
5378
查看次数

View.invalidate() 非常慢。备择方案?

我正在本机代码中执行一些位图动画,因此我需要每帧重绘 ImageView:

class MyImageView extends ImageView
{
    ...

    protected void onDraw( Canvas canvas )
    {
        native_drawStuff( handle, canvas );
        invalidate();
    }
}
Run Code Online (Sandbox Code Playgroud)

看起来一切都很好,除了 Traceview 显示了这一点:

在此输入图像描述

我不了解你,但这似乎有点荒谬。native_drawStuff() 正在设置位图的每个像素,然后将位图绘制到画布上,而一个简单的 invalidate() 调用花费的时间几乎比这长 4 倍?位图也不小(RGBA_8888 和 50k 到 300k 像素之间的任何位置)。

鉴于我需要每帧重绘整个 ImageView,是否有更好的方法来做到这一点?我见过的对此的唯一建议是仅使需要重绘的视图部分无效,但就我而言,无论如何这就是整个事情。

android bitmap android-ndk

5
推荐指数
1
解决办法
5552
查看次数

Android NDK:如何链接多个第三方库

假设我们正在构建一个共享库A,它需要链接到2个外部静态库B和C.你所拥有的只是libB.a和libC.a,以及它们的头文件.

这是libA的简化Android.mk:

LOCAL_LDLIBS := ../external/libB.a ../external/libC.a

include $(BUILD_SHARED_LIBRARY)
Run Code Online (Sandbox Code Playgroud)

AFAIK,链接共享库的工作方式是:

  1. 获取B和C的所有目标文件
  2. 去掉A没有引用的目标文件
  3. 解决B和C中的引用

这会产生链接错误,因为B和C互相调用,特别是它们调用在步骤2中被删除的函数,因为A没有调用它们.

如果我们自己构建静态库,那么只需用LOCAL_WHOLE_STATIC_LIBRARIES替换LOCAL_STATIC_LIBRARIES就可以防止代码剥离(代码大小).在引擎盖下,它将--whole-archive传递给链接器.

由于我们没有构建B和C(甚至没有重建它们的源),有哪些选择?

  1. 从A手动引用缺失的函数,以便它们不会被剥离
  2. 弄清楚如何将--whole-archive传递给外部静态库的链接器
  3. 使用PREBUILT_STATIC_LIBRARY(看到它提到,但从未使用它,根据文档,它听起来不适用于这种情况)
  4. 构建可执行文件而不是共享库(不会以相同的方式剥离代码)
  5. 移动/重命名外部库以欺骗NDK构建系统认为它们是我的,以便我可以将它们添加到LOCAL_WHOLE_STATIC_LIBRARIES.

我已经选择了1,因为它是第一个有用的东西,但显然它不是很好.我在问是否有更好的解决方案.

这个问题的答案(当使用Android NDK预构建静态和共享库时链接问题)让我想知道是否需要重新评估我的构建设置(链接到外部静态库的共享库).我无法在那里发表评论,所以我在这里问自己的问题.

android static-libraries android-ndk

4
推荐指数
1
解决办法
9788
查看次数