从文档开始:
public void setRetainInstance(boolean retain)
控制是否在活动重新创建(例如从配置更改)中保留片段实例.这只能用于不在后栈中的片段.如果设置,则在重新创建活动时,片段生命周期会略有不同:
- onDestroy()不会被调用(但是onDetach()仍然会被调用,因为片段正在与其当前活动分离.
- 因为片段没有被重新创建,所以不会调用onCreate(Bundle).
- onAttach(Activity)和onActivityCreated(Bundle)仍将被调用.
我有一些问题:
片段是否也保留其视图,还是会在配置更改时重新创建?"保留"究竟是什么意思?
当用户离开活动时,片段是否会被销毁?
为什么它不适用于后端堆栈上的碎片?
哪个是使用此方法有意义的用例?
我无法更新ViewPager中的内容.
一个问题:FragmentPagerAdapter类中的方法instantiateItem()和getItem()的关系和正确用法是什么?
我只使用getItem()实例化并返回我的片段:
@Override
public Fragment getItem(int position) {
return new MyFragment(context, paramters);
}
Run Code Online (Sandbox Code Playgroud)
这很好用(但据说我不能改变内容).
所以我发现了这个:ViewPager PagerAdapter没有更新View
特别是在其中讨论了方法instantiateItem():
"我的方法是对instantiateItem()方法中的任何实例化视图使用setTag()方法"
所以现在我想实现instantiateItem()才能做到这一点.但我不知道我必须返回那里(return是Object)和getItem(int position)的关系是什么?
目前我正在使用getItem来实例化Fragment,这是错的吗?但是,我是否必须将片段放在实例变量中,或者根本不实现getItem()......?我只是不明白.
我试过阅读参考资料:
public abstract Fragment getItem(int position)
返回与指定位置关联的片段.
public Object instantiateItem(ViewGroup容器,int位置)
创建给定位置的页面.适配器负责将视图添加到此处给出的容器,但它必须确保在从finishUpdate(ViewGroup)返回时完成此操作.参数
容器包含将在其中显示页面的View.position要实例化的页面位置.
返回
返回表示新页面的Object.这不需要是View,但可以是页面的其他容器.
......但我仍然不明白它们是如何相关的以及我必须做些什么.
这是我的代码.我正在使用支持包v4.
ViewPagerTest
public class ViewPagerTest extends FragmentActivity {
private ViewPager pager;
private MyFragmentAdapter adapter;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.pager1);
pager = (ViewPager)findViewById(R.id.slider);
String[] data = {"page1", "page2", "page3", "page4", "page5", "page6"};
adapter = new MyFragmentAdapter(getSupportFragmentManager(), 6, this, …Run Code Online (Sandbox Code Playgroud) 我得到了一个应用程序TransactionTooLargeException的错误跟踪.不可重复,从未有过.在文档中说
Binder事务失败,因为它太大了.
在远程过程调用期间,调用的参数和返回值将作为存储在Binder事务缓冲区中的Parcel对象传输.如果参数或返回值太大而不适合事务缓冲区,则调用将失败并抛出TransactionTooLargeException.
...
当远程过程调用抛出TransactionTooLargeException时,有两种可能的结果.客户端无法将其请求发送到服务(很可能,如果参数太大而无法放入事务缓冲区中),或者服务无法将其响应发送回客户端(最有可能的话,如果返回值为太大而不适合事务缓冲区).
...
所以,好吧,我正在传递或接收超出某个未知限制的参数.但是哪里?
堆栈跟踪不会显示我的文件中的任何内容:
java.lang.RuntimeException: Adding window failed
at android.view.ViewRootImpl.setView(ViewRootImpl.java:548)
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:406)
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:320)
at android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.java:152)
at android.view.Window$LocalWindowManager.addView(Window.java:557)
at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2897)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)
at android.app.ActivityThread.access$600(ActivityThread.java:139)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1262)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:4977)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
at dalvik.system.NativeStart.main(Native Method)
Caused by: android.os.TransactionTooLargeException
at android.os.BinderProxy.transact(Native Method)
at android.view.IWindowSession$Stub$Proxy.add(IWindowSession.java:569)
at android.view.ViewRootImpl.setView(ViewRootImpl.java:538)
... 16 more
android.os.TransactionTooLargeException
at android.os.BinderProxy.transact(Native Method)
at android.view.IWindowSession$Stub$Proxy.add(IWindowSession.java:569)
at android.view.ViewRootImpl.setView(ViewRootImpl.java:538)
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:406)
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:320)
at android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.java:152)
at android.view.Window$LocalWindowManager.addView(Window.java:557)
at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2897)
at …Run Code Online (Sandbox Code Playgroud) 我想为TextView启用标准复制粘贴(与EditText相同).我该怎么做?
我尝试使用不可编辑的EditText但它运行不正常(有时它变得可编辑或者没有显示复制粘贴叠加).而且一般来说这可能不是一个好方法.
需要从API 7开始的工作解决方案.
我遇到了maven依赖的问题,这个问题在我的本地资源库中.
SBT找不到它.已经将日志级别设置为调试,但没有获得任何新内容.
这些文件位于存储库中.我将粘贴路径从控制台复制到文件资源管理器,它们就在那里.
输出:
[debug] trying file://c:/Users/userz/.m2/repository/com/twitter/naggati/2.0.0/naggati-2.0.0.pom
[debug] tried file://c:/Users/userz/.m2/repository/com/twitter/naggati/2.0.0/naggati-2.0.0.pom
[debug] Local Maven Repository: resource not reachable for com/twitter#naggati;2.0.0: res=file://c:/Users/userz/.m2/repository/com/twitter/naggati/2.0
.0/naggati-2.0.0.pom
[debug] trying file://c:/Users/userz/.m2/repository/com/twitter/naggati/2.0.0/naggati-2.0.0.jar
[debug] tried file://c:/Users/userz/.m2/repository/com/twitter/naggati/2.0.0/naggati-2.0.0.jar
[debug] Local Maven Repository: resource not reachable for com/twitter#naggati;2.0.0: res=file://c:/Users/userz/.m2/repository/com/twitter/naggati/2.0
.0/naggati-2.0.0.jar
[debug] Local Maven Repository: no ivy file nor artifact found for com.twitter#naggati;2.0.0
Run Code Online (Sandbox Code Playgroud)
编辑:我在项目/构建中使用scala文件添加了路径,如http://code.google.com/p/simple-build-tool/wiki/LibraryManagement中所述
"如果你将它添加为存储库,sbt可以搜索你当地的Maven存储库:"
val mavenLocal = "Local Maven Repository" at "file://"+Path.userHome+"/.m2/repository"
Run Code Online (Sandbox Code Playgroud)
这使得sbt看起来在本地存储库中.之前没有.
所以scala文件看起来像这样:
import sbt._
class Foo(info: ProjectInfo) extends DefaultProject(info) {
val mavenLocal = "Local Maven Repository" at "file://c:/Users/userz/.m2/repository" …Run Code Online (Sandbox Code Playgroud) 我正在改变幻灯片
viewPager.setCurrentItem(index++, true);
Run Code Online (Sandbox Code Playgroud)
但它变快了.有没有办法手动设置动画速度?
搜索过,发现有人问到同样的地方(除了StackOverflow,也许我有运气:)),没有答案.
喜欢:
https://groups.google.com/group/android-developers/browse_thread/thread/a13405c0b5833893?fwc=1
提前致谢.
我想了解此异常以实现正确的修复.
概述:
有一个ViewPager,它使用FragmentStatePagerAdapter通过getItem和实例化2个片段MyFragmentClass.newInstance(...).
Adapter的getItem看起来像这样:
@Override
public Fragment getItem(int position) {
Fragment fragment = null;
switch(position) {
case 0:
fragment = MyFragment2.newInstance(par1);
break;
case 1:
fragment = MyFragment2.newInstance(par2, par3);
break;
}
return fragment;
}
Run Code Online (Sandbox Code Playgroud)
问题:
当活动被销毁并再次创建时,适配器再次被实例化,片段再次创建MyFragmentClass.newInstance(...)...但在此行上:
pager.setAdapter(adapter);
我得到了提到的例外.
我查看了抛出异常的源代码,它是这样的:
@Override
public Fragment getFragment(Bundle bundle, String key) {
int index = bundle.getInt(key, -1);
if (index == -1) {
return null;
}
if (index >= mActive.size()) {
throw new IllegalStateException("Fragement no longer exists for key "
+ key + …Run Code Online (Sandbox Code Playgroud) 我需要一个可靠的Javascript库/函数来检查HTML代码段是否有效,我可以从我的代码中调用它.例如,它应检查打开的标签和引号是否已关闭,嵌套是否正确等.
我不希望验证失败,因为某些东西不是100%标准(但无论如何都会起作用).
我在一些使用FragmentStatePagerAdapter的活动的onResume()中获得了这个.使用设备的后退按钮时.不总是.不可重复.
我正在使用支持包v4,最新修订版(8).
已经用谷歌搜索过,没有成功找到有用的答案.
在源代码中,它被抛出:FragmentManager.java
@Override
public void putFragment(Bundle bundle, String key, Fragment fragment) {
if (fragment.mIndex < 0) {
throw new IllegalStateException("Fragment " + fragment
+ " is not currently in the FragmentManager");
}
bundle.putInt(key, fragment.mIndex);
}
Run Code Online (Sandbox Code Playgroud)
但是为什么片段的索引<0呢?
实例化片段的代码:
@Override
public Fragment getItem(int position) {
Fragment fragment = null;
switch(position) {
case 0:
fragment = MyFragment.newInstance(param1);
break;
case 1:
fragment = MyFragment2.newInstance(param2, param3);
break;
}
return fragment;
}
@Override
public int getCount() {
return 2;
}
Run Code Online (Sandbox Code Playgroud)
我也无法通过源调试,因为支持包不允许我附加源,出于某种原因......但这是一个不同的问题......
我正在尝试使用泛型实现以下结构.得到一个奇怪的编译器错误,无法弄清楚原因.
class Translator<T:Hashable> {...}
class FooTranslator<String>:Translator<String> {...}
Run Code Online (Sandbox Code Playgroud)
这个想法是Translator使用T作为字典中键的类型.这可以是例如String或枚举.子类提供具体的字典.
但它失败的原因是:"类型'字符串'不符合协议'Hashable'"
但String符合Hashable!我疯了吗?它也不适用于Int,它也符合Hashable.如果我将Hashable替换为Equatable也不起作用,这也应该由两者实现.
If I remove the type constraint, just for testing (where I also have to disable the dictionary, as I can't use anything not hashable as key there) - it compiles
class Translator<T> {...}
class FooTranslator<String>:Translator<String> {...}
Run Code Online (Sandbox Code Playgroud)
What am I doing wrong?
android ×7
animation ×1
copy-paste ×1
exception ×1
fragment ×1
generics ×1
html ×1
javascript ×1
maven ×1
sbt ×1
scala ×1
swift ×1
textview ×1
validation ×1