小编Kit*_*fer的帖子

Robolectric是否支持API级别?

我有一些测试,我想用Robolectric运行,我使用2.3-SNAPSHOT因为我的APP使用ActionbarCompat我需要使用2.3-SNAPSHOT版本,因为Robolectric以前找不到AppCompat主题.所以我在Eclipse中设置了Classpath,我最终得到了这个:

java.lang.UnsupportedOperationException: Robolectric does not support API level 9, sorry!
at org.robolectric.SdkConfig.<init>(SdkConfig.java:24)
at org.robolectric.RobolectricTestRunner.pickSdkVersion(RobolectricTestRunner.java:288)
at org.robolectric.RobolectricTestRunner.getEnvironment(RobolectricTestRunner.java:264)
at org.robolectric.RobolectricTestRunner.access$100(RobolectricTestRunner.java:57)
at org.robolectric.RobolectricTestRunner$2.evaluate(RobolectricTestRunner.java:186)
at org.junit.runners.BlockJUnit4ClassRunner.runNotIgnored(BlockJUnit4ClassRunner.java:79)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:71)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:49)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
at org.robolectric.RobolectricTestRunner$1.evaluate(RobolectricTestRunner.java:172)
at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Run Code Online (Sandbox Code Playgroud)

我的测试项目的清单是这样的:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.vendor.test" 
      android:versionCode="1"
      android:versionName="1.0">
      <application>
           <uses-library android:name="android.test.runner" />
      </application>
      <uses-sdk android:minSdkVersion="19" android:targetSdkVersion="19" />
      <instrumentation android:name="android.test.InstrumentationTestRunner"
       android:targetPackage="com.vendor" />
</manifest>
Run Code Online (Sandbox Code Playgroud)

无论我使用什么,我总是抱怨API等级.

有人这个有用吗?

android robolectric

69
推荐指数
3
解决办法
2万
查看次数

如何以一种聪明的方式将Java.util.Map写入parcel?

我有一个字符串的通用映射(键,值),这个字段是我需要可以分配的Bean的一部分.所以,我可以使用Parcel#writeMap方法.API Doc说:

请改用writeBundle(Bundle).在当前dataPosition()中将Map展平到parcel中,如果需要,增加dataCapacity().Map键必须是String对象.Map值使用writeValue(Object)编写,并且必须遵循其中的规范.强烈建议使用writeBundle(Bundle)而不是此方法,因为Bundle类提供了一个类型安全的API,允许您在编组时避免神秘的类型错误.

因此,我可以迭代我的Map中的每个条目并将其放入Bundle中,但我仍然在寻找一种更聪明的方法.我缺少Android SDK中的任何方法吗?

目前我这样做:

final Bundle bundle = new Bundle();
final Iterator<Entry<String, String>> iter = links.entrySet().iterator();
while(iter.hasNext())
{
    final Entry<String, String>  entry =iter.next();
    bundle.putString(entry.getKey(), entry.getValue());
}
parcel.writeBundle(bundle);
Run Code Online (Sandbox Code Playgroud)

android bundle parcelable

62
推荐指数
4
解决办法
3万
查看次数

在Bundle中存储SparseBooleanArray的最佳方法?

当配置更改发生时,我的ListView复选框状态会丢失,我理解为什么.我试着实施

public void onSaveInstanceState(final Bundle outState)
Run Code Online (Sandbox Code Playgroud)

在我的一个碎片中.所以我只是想知道在outState中存储SparseBooleanArray的最简单方法是什么.

另外,我有点困惑,因为ListView有方法:

getListView().getCheckedItemPositions();
Run Code Online (Sandbox Code Playgroud)

这有什么用?

methods android sparse-array onconfigurationchanged

14
推荐指数
2
解决办法
8847
查看次数

Lint报告StringBuilder会影响性能

在我的项目上,我刚做了一个LINT检查,到目前为止我很满意.但我很好奇为什么LINT报告说StringBuilder的使用很慢?

我刚才从Eclipse切换到Android Studio,那些由eclipse生成的toString()方法可以获得更好的调试输出:

@Override
public String toString()
{
    final StringBuilder builder = new StringBuilder();
    builder.append("param1");
    builder.append(param1);
    builder.append(", param2");
    builder.append(param2);
    builder.append("param3");
            ....
    return builder.toString();
}
Run Code Online (Sandbox Code Playgroud)

在Studio中,它报告了'用String替换StringBuilder'.从我的角度来看,StringBuilder总是更快,更友好的GC方法.还是DEX有些聪明,我不知道吗?

我搜索了LINT Checks而没有任何描述

performance android lint

10
推荐指数
1
解决办法
1871
查看次数

选择器继承

有没有办法从selectorAndroid中已知的s 继承?

我想扩展一个EditText并添加一个自定义状态,到目前为止,我理解使用onCreateDrawableState()方法进行.当一个选择器进入游戏时有一个简单的方法来使用默认选择器,只是添加我的而不是再次定义它们?

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res/com.my.package">

<item android:state_enabled="false" android:drawable="@drawable/login_textfield_bg_error" />
<item android:state_window_focused="false" android:drawable="@drawable/login_textfield_bg_error">
<item android:state_pressed="true" android:drawable="@drawable/login_textfield_bg_error" />
<item android:state_selected="true" android:drawable="@drawable/login_textfield_bg_error" />
<item app:errorBackground="@drawable/login_textfield_bg_error" />
</selector>
Run Code Online (Sandbox Code Playgroud)

android state selector

9
推荐指数
1
解决办法
930
查看次数

OTTO和其他活动中的碎片

我昨天开始使用Square的OTTO,到目前为止,我有一个良好的开端.

当您的片段已经托管在FragmentActivity中时,Otto可以很好地开箱即用,您只需要在FragmentActivity托管的Fragment之间进行通信.

在托管时,您的#onResume()Methode被调用,Fragment可以在Eventbus上注册自己:

@Override
public void onResume()
{
    super.onResume();
    BusProvider.getInstance().register(this);
}
Run Code Online (Sandbox Code Playgroud)

我的问题:

片段嵌入在一个额外的 Activity中,它应该通过Eventbus接收事件,如下所示:

public AnotherFragmentHostedInSomeActivity extends Fragment
{
         .....

    @Subscribe
    public void onSomethingHappend(final Event event)
    {

          final SomeObject deliveredObject = event.getSomeObject();
Run Code Online (Sandbox Code Playgroud)

但是当你想在那里调用托管片段的另一个活动时,看起来事情仍然很复杂:

public class SomeFragmentSendingDataToAnotherFragment extends Fragment
{
            ...
    private void sendData()
    {
            final Intent intent = new Intent(applicationContext, SomeActivity.class);
            applicationContext.startActivity(intent);                                 
            BusProvider.getInstance().post(new Event(someObject));
Run Code Online (Sandbox Code Playgroud)

正如您可能已经看到的,这段代码很狡猾.启动一个Activity然后将Data发送到该Activity托管的Fragment,因为生命周期不能正常工作.因此,活动也会被创建,而Fragements也会被创建.有时会调用onResume Methode,因此Fragement可以使用@Subscribe注册.但这一切都发生事件已经通过EventBus发布.因此,拦截的片段永远不会被EventBus调用.

任何人都知道如何以聪明的方式做到这一点?

那里还有一些额外的信息:我昨天和奥托一起玩得很好.当我需要将数据发送到另一个活动时,问题只出现在我的项目中,在我的情况下,当APP在智能手机上运行时,而不是平板电脑上运行.在我通过Intent和Parcelable发送所有数据之前.Otto会减少编写Parcleable Objects的需求,所以我想这样做.

谢谢你的回答

android-fragments android-activity otto

7
推荐指数
1
解决办法
7164
查看次数

使用ActionBarCompat和requestWindowFeature

到目前为止,我从ActionBarSherlock转移到ActionBarCompat没有更大的问题.在我的Nexus 4上,它的效果非常好.当我开始测试运行2.3.6的旧版Nexus One时,我在旋转设备时遇到了问题.我请求一个Window功能来显示ActionBar中的中间进度:

@Override
protected void onCreate(final Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);

    requestWindowFeature(android.view.Window.FEATURE_PROGRESS);
    requestWindowFeature(android.view.Window.FEATURE_INDETERMINATE_PROGRESS);

    setupActionBar(getSupportActionBar());

}
Run Code Online (Sandbox Code Playgroud)

这对果冻豆很有效.

在2.3.6上获取此Stack Trace:

08-12 13:34:09.242: E/AndroidRuntime(4602): FATAL EXCEPTION: main
08-12 13:34:09.242: E/AndroidRuntime(4602): java.lang.RuntimeException: Unable to start activity ComponentInfo{net.app.packagename/net.app.fragment.CustomActivity}: android.util.AndroidRuntimeException: requestFeature() must be called before adding content
08-12 13:34:09.242: E/AndroidRuntime(4602):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647)
08-12 13:34:09.242: E/AndroidRuntime(4602):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
08-12 13:34:09.242: E/AndroidRuntime(4602):     at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:2832)
08-12 13:34:09.242: E/AndroidRuntime(4602):     at android.app.ActivityThread.access$1600(ActivityThread.java:117)
08-12 13:34:09.242: E/AndroidRuntime(4602):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:935)
08-12 13:34:09.242: E/AndroidRuntime(4602):     at android.os.Handler.dispatchMessage(Handler.java:99)
08-12 13:34:09.242: E/AndroidRuntime(4602):     at android.os.Looper.loop(Looper.java:130)
08-12 13:34:09.242: E/AndroidRuntime(4602):     at …
Run Code Online (Sandbox Code Playgroud)

android android-actionbar-compat

6
推荐指数
1
解决办法
4888
查看次数

ActionBar Sherlock Progressbar没有在3.1上显示但在4.0+上显示

看起来我有一个较小的问题,但无法找到原因.在我的SherlockFragmentActivity onCreate中,我执行以下操作:

@Override
public void onCreate(final Bundle savedInstanceState)
{
    requestWindowFeature(Window.FEATURE_PROGRESS);
    requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
    super.onCreate(savedInstanceState);
Run Code Online (Sandbox Code Playgroud)

AndroidManifest.xml

<uses-sdk
    android:minSdkVersion="8"
    android:targetSdkVersion="15" />
Run Code Online (Sandbox Code Playgroud)

在加载一些数据的片段中,我做了一个简单的事情:

    getSherlockActivity().setSupportProgressBarIndeterminateVisibility(true);
Run Code Online (Sandbox Code Playgroud)

所有在ICS上工作都很好,但在我的3.1平板电脑上运行的相同代码在请求时从不显示ProgressBar.任何人都可以给我一个提示,为什么会这样?

我在运行2.2的模拟器中也遇到了问题,没有显示进度.我再次查看Sherlock Samples中的FeatureToggles,相同的代码,不同的结果:/

PS:使用ActionBar Sherlock 4.01

android android-3.0-honeycomb actionbarsherlock android-actionbar progress-bar

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

FragmentPagerAdapter instantiateItem 与 Fragment 一起使用吗?

我尝试让我的 FragmentPagerAdapter 正常工作,但这些示例对于现实生活来说有点简单:

@Override
public Object instantiateItem(final ViewGroup container, final int position)
{
    final LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    int resId = 0;
    switch (position)
        {
        case 0:
            resId = R.layout.favorites_fragment;
            break;
        case 1:
            resId = R.layout.nearby_list_fragment;
            break;
        default:
            throw new IllegalArgumentException("Index cant be mapped to fragement:" + position);
        }

    final View view = inflater.inflate(resId, null);

    viewPager.addView(view, 0);

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

因为我想使用片段,所以我已经对这个方法感到困惑了,作为所有示例,我可以找到充气视图而不是在那里创建片段。这个怎么做 ?

PS:我使用 ActionBarSherlock lib 4.1...

谢谢,延斯

android fragment android-viewpager fragmentpageradapter

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

ActionBar主要部分的选项卡

如何在Android中存档这样的Tab布局?选项卡导航是主操作栏的一部分,不在下面.PS:我正在使用ActionBar Sherlock

目前只是这样做:

actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
Run Code Online (Sandbox Code Playgroud)

当前的ActionBar

但我希望看起来像这样:

ActionBar设计

谢谢你的帮助,Kitesurfer

android actionbarsherlock android-actionbar

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