我有一些测试,我想用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等级.
有人这个有用吗?
我有一个字符串的通用映射(键,值),这个字段是我需要可以分配的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) 当配置更改发生时,我的ListView复选框状态会丢失,我理解为什么.我试着实施
public void onSaveInstanceState(final Bundle outState)
Run Code Online (Sandbox Code Playgroud)
在我的一个碎片中.所以我只是想知道在outState中存储SparseBooleanArray的最简单方法是什么.
另外,我有点困惑,因为ListView有方法:
getListView().getCheckedItemPositions();
Run Code Online (Sandbox Code Playgroud)
这有什么用?
在我的项目上,我刚做了一个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而没有任何描述
有没有办法从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) 我昨天开始使用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的需求,所以我想这样做.
谢谢你的回答
到目前为止,我从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) 看起来我有一个较小的问题,但无法找到原因.在我的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
我尝试让我的 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中存档这样的Tab布局?选项卡导航是主操作栏的一部分,不在下面.PS:我正在使用ActionBar Sherlock
目前只是这样做:
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
Run Code Online (Sandbox Code Playgroud)

但我希望看起来像这样:

谢谢你的帮助,Kitesurfer
android ×9
bundle ×1
fragment ×1
lint ×1
methods ×1
otto ×1
parcelable ×1
performance ×1
progress-bar ×1
robolectric ×1
selector ×1
sparse-array ×1
state ×1