Articles of android fragments

Android下载多个文件并在ListView中显示进度

我有N个文件要下载。 我想在后台连续下载它们 – 一个接一个。 我想在ListView中显示进度和状态。 所以,ListView看起来像: File1 …已下载 文件2 ….下载 File3 …正在进行中说39% File4 ……待定 …. Listview定期刷新(比如说每2秒),文件很大:50 MB左右。 所以他们需要1分钟才能下载。 我将文件URL列表传递给AsyncTask并将其下载到后台。 问题是如何将进度反馈回ListView。 考虑用户可以离开ListView页面离开AsyncTask只运行返回以查看下载状态。 那么ListView如何“观察”AsyncTask的进度并显示它呢? 我正在考虑添加一组静态variablesAsyncTask(使用“Synchronized”块保护它们)并在Fragment中使用一个显示ListView的定期UI Updater。 所以片段会有这样的东西: 有时间延迟重复一项任务? 是否有设计模式,公共项目或示例代码? 对不起,我不是一张好照片。 我所描述的最接近的是这里(类似但我计划使用AsyncTask和串行下载):

片段必须是要从实例状态正确重新创建的公共静态类

更新到最新的支持存储库后, compile ‘com.android.support:appcompat-v7:24.2.0’ compile ‘com.android.support:design:24.2.0’ compile ‘com.android.support:percent:24.2.0’ compile ‘com.android.support:recyclerview-v7:24.2.0’ 我得到了奇怪的例外。 java.lang.IllegalStateException: Fragment null must be a public static class to be properly recreated from instance state. at android.support.v4.app.BackStackRecord.doAddOp(BackStackRecord.java:435) at android.support.v4.app.BackStackRecord.add(BackStackRecord.java:414) at android.support.v4.app.DialogFragment.show(DialogFragment.java:154) at com.androidapp.base.BaseActivity.showDialogFragment(BaseActivity.java:78) at com.androidapp.MainActivity.showNewDialog(MainActivity.java:304) at com.androidapp.MainActivity$6.onClick(MainActivity.java:228) 在我的BaseActivity类中,我创建了一个可重用的片段,可以在扩展BaseActivty的活动类中使用 public void showDialogFragment(DialogFragment newFragment) { FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); Fragment prev = getSupportFragmentManager().findFragmentByTag(“dialog”); if (prev != […]

键盘隐藏片段中的EditTexts

编辑:我需要使用键盘,但它隐藏了我的EditText ,我需要它滚动所以键盘没有隐藏它。 我正在使用三星平板电脑。 我的风格: parent=”android:Theme.Holo.NoActionBar.Fullscreen” EditText字段位于可滚动视图中,如下所示: 片段布局: 活动布局: 已经提出了类似的问题,但我没有find有效的答案。 我有一个项目使用附加到一个活动的许多片段。 在我的活动清单中: android:windowSoftInputMode=”stateHidden” 一些片段需要用户输入。 在片段布局中我使用: 每个片段嵌套如下: 这很好用。 除键盘外,还会隐藏位于页面下方的EditTexts。 我一遍又一遍地读到这个: http://developer.android.com/reference/android/widget/TextView.html#attr_android:imeOptions 尝试了这些建议,但是当调用活动时键盘可见,这是我不想要的。 它也行不通。 也许是因为它是片段? SoftKeyboard隐藏EditText Android键盘隐藏了EditText 我一直在尝试制定动态解决方案。 任何帮助表示赞赏。 编辑:这是在平板电脑上使用,只有一个键盘选项,语言更改。 编辑:我的解决方案 我通过安装另一个软键盘解决了这个问题。 https://code.google.com/p/softkeyboard/wiki/HowTo

Android ListFragment不保存onSaveInstanceState()中的包/不检索onActivityCreated()中的包

我是android新手,我面临以下问题。 我正在为Android 2和3开发,这就是我使用片段的原因。 然而,为了使应用程序在Android 2设备上运行,我导入android.support.v4.app.ListFragment。 当屏幕方向改变时,我需要在ListFragment中保持选择。 我重写onSaveInstanceState()方法并将int放入bundle中。 旋转屏幕时,将调用此方法并将int添加到包中。 但是,当调用onActivityCreated()时,其bundle为null。 我正在关注Android网站上提供的示例: http : //developer.android.com/reference/android/app/Fragment.html ,但如上所述 – 在调用onSaveInstanceState()之后, onActivityCreated()的包仍然是空值。 这是代码: import android.support.v4.app.ListFragment; public class VisitsHomeFragment extends ListFragment { private int selectedPosition = -1; @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); if (savedInstanceState != null) { if (savedInstanceState.containsKey(“SELECTED_POSITION”)) { selectedPosition = savedInstanceState.getInt(“SELECTED_POSITION”); } } } @Override public void […]

活动和片段生命周期和方向变化

我一直有非常奇怪的问题Fragments和方向更改已导致强制关闭而不遵循逻辑模式。 我创建了一个简单的Activity和Fragment生命周期调试应用程序,它通过报告对logcat的调用来简单地实现Activity生命周期和Fragment生命周期的每一步。 以下是TestActivity和TestFragment类: 测试活动 public class TestActivity extends Activity { Context ct = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.e(“ACT”, “onCreate called”); ct = getApplicationContext(); FrameLayout fl = new FrameLayout(ct); fl.setId(1000); TestFragment tf = new TestFragment(); getFragmentManager().beginTransaction().add(fl.getId(), tf, “”).commit(); setContentView(fl); } @Override protected void onStart() { Log.e(“ACT”, “onStart called”); super.onStart(); } @Override protected […]

Android,谷歌地图片段和viewpager – 错误膨胀类片段

我试图在一个片段中的viewpager(fragmentpager)中使用google maps v2。 如果我刷到第四个片段(查看寻呼机),它工作正常,但如果我回到第一个片段,然后回到第四个 – 与地图 – 我的应用程序死了。 07-04 19:38:20.937: E/AndroidRuntime(20175): FATAL EXCEPTION: main 07-04 19:38:20.937: E/AndroidRuntime(20175): android.view.InflateException: Binary XML file line #13: Error inflating class fragment … 07-04 19:38:20.937: E/AndroidRuntime(20175): Caused by: java.lang.IllegalArgumentException: Binary XML file line #13: Duplicate id 0x7f050010, tag null, or parent id 0x0 with another fragment for com.google.android.gms.maps.SupportMapFragment 07-04 19:38:20.937: […]

隐藏的backstack片段在配置更改时重新显示

我正在构建一个活动多片段应用程序。 每次交易后我都会添加到backstack。 在几次隐藏和显示片段然后我旋转手机之后,容器上添加的所有片段都被恢复,每个片段都在另一个片段之上。 可能是什么问题? 为什么我的活动会显示我之前隐藏的片段? 我正在考虑隐藏所有以前隐藏的现在显示的片段,但是有更“优雅”的方式吗?

暂停时onClick或onItemClick会导致“IllegalStateException:onSaveInstanceState后无法执行此操作”

我有一个TabActivity ,它承载5x FragmentActivity 。 其中一些包含按钮或列表,在其onClick()或onItemClick()中创建并推送新片段。 在大多数情况下,这工作正常,但如果事情有点反应迟钝,或者测试人员做了一些愚蠢的事情(按住按钮或列表项,使用不同的手指切换标签,然后释放按钮/列表 – 100%可重复),我在活动暂停并保存后很快得到点击事件。 请参阅日志片段: 10-30 17:05:16.258 3415 3415 D BKC DEBUG: More.onSaveInstanceState() 10-30 17:05:16.258 3415 3415 D BKC DEBUG: MoreFragment.onPause() 10-30 17:05:17.309 3415 3415 D BKC DEBUG: MoreFragment.onItemClick() 在阅读了本文以及有关片段状态丢失的各种StackOverflow问题后,我没有看到如何解决这个问题的良好答案。 使用commitAllowingStateLoss() (无条件)是一种可以隐藏真正错误的解决方法。 我不确定在onSaveInstanceState中取消注册OnClickListener和OnItemClickListener会100%阻止这种情况,并且它是PITA为每个片段中的每个按钮执行此操作。 有人建议检查相关片段的isAdded() ,但我可以确认这不起作用。 我可以在onSaveInstanceState()和onRestoreInstanceState()设置一个标志,并在onClick()中检查,但同样,这只是一个kludge。 编辑:哦,片段没有onRestoreInstanceState() ,但我可以在onResume()或其他任何东西旋转旗帜。 是否有正确的解决方法,我错过了,或者我应该选择我的选择?

无法使用Fragment.setRetainInstance()作为Activity.onRetainNonConfigurationInstance()的替代品

根据Android API文档,不推荐使用Activity.onRetainNonConfigurationInstance()来支持Fragment.setRetainInstance() 。 但是,我遇到了两个不同的情况,Fragment.setRetainInstance()似乎不可行。 如果Fragment包含WebView。 根据Diane Hackborne的说法,您不能在配置更改中重用WebView。 我想这意味着你需要在屏幕旋转时允许Fragment拆除并重新创建WebView,并使用WebView.saveState()和WebView.restoreState()来恢复Web视图状态。 如果Fragment属于配置更改后不再存在的布局,则当FragmentManager尝试恢复Fragment时,它将抛出: java.lang.IllegalArgumentException: No view found for id 0x7f060091 for fragment 如果您在横向模式下具有双片段布局,但在纵向模式下具有单片段布局,则会发生这种情况(例如)。 当从landscape转换为portrait时,如果setRetainInstance()设置为true,则Fragment都不会被销毁,但是一个片段不再具有要重新附加的有效视图,因此是exception。 因此,如果您正在构建基于Fragment的应用程序,并且需要在配置更改之间保留数据(例如对运行的AsyncTasks的引用),并且您不能使用Fragment.setRetainInstance() ,并且没有Fragment.onRetainNonConfigurationInstance (),最好的方法是什么?

Loader将结果传递给错误的片段

我有一个基于Android开发人员示例使用ActionBar选项卡滑动选项卡的活动。 每个选项卡显示一个片段,每个片段(实际上是SherlockFragment)通过自定义AsyncTaskLoader加载不同types的远程api请求。 问题是,如果您点击一个选项卡移动2个选项卡/页面,而您要离开的选项卡的片段(旧片段)正在加载结果,则该结果将传递到您移动到的选项卡的片段(新片段)。 在我的情况下,这会导致ClassCastException,因为预期的结果是不兼容的types。 在代码中,情况的要点是: 装载机: public class FooLoader extends AsyncTaskLoader public class BarLoader extends AsyncTaskLoader 片段: public class FooFragment extends Fragment implements LoaderManager.LoaderCallbacks { … @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getLoaderManager().initLoader(0, null, this); } public Loader onCreateLoader(int id, Bundle args) { return new FooLoader(); } … } public class BarFragment extends Fragment […]