小编pro*_*m85的帖子

当Fragment被重新显示时,Fragment中的ViewPager会丢失它的内容

我有一个带有ViewPager的简单片段.

我正在使用最新的支持库,v4 rev18!

如果我第一次显示它,一切正常,如果我回去再次显示它,应用程序崩溃时出现以下异常:

java.lang.NullPointerException
at android.support.v4.app.FragmentManagerImpl.getFragment(FragmentManager.java:569)
at android.support.v4.app.FragmentStatePagerAdapter.restoreState(FragmentStatePagerAdapter.java:211)
at android.support.v4.view.ViewPager.onRestoreInstanceState(ViewPager.java:1281)
at android.view.View.dispatchRestoreInstanceState(View.java:12043)
at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:2688)
at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:2694)
at android.view.View.restoreHierarchyState(View.java:12021)
at android.support.v4.app.Fragment.restoreViewState(Fragment.java:425)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:949)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1104)
at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1460)
at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:440)
at android.os.Handler.handleCallback(Handler.java:615)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4800)
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:798)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:565)
at dalvik.system.NativeStart.main(Native Method)
Run Code Online (Sandbox Code Playgroud)

我的简单课程看起来像以下,应该是,实际上,很好......

public class RoutineDayFragment extends BaseFragment
{
    private RoutinesActivity mParent = null;

    @InjectView(R.id.pager)
    MyViewPager pager = null;
    @InjectView(R.id.indicator)
    PagerSlidingTabStrip indicator = null;

    private FragmentStatePagerAdapter mAdapter = null;

    @Override
    public …
Run Code Online (Sandbox Code Playgroud)

android android-fragments android-viewpager android-support-library

16
推荐指数
1
解决办法
7494
查看次数

RXJava - 创建一个可暂停的可观察对象(例如缓冲区和窗口)

我想创建以下内容的observable:

  • 缓冲所有项目,同时暂停
  • 立即发出物品,而不是暂停
  • 暂停/恢复触发器必须来自另一个可观察者
  • 它必须保存以供不在主线程上运行的observable使用,并且必须保存以更改主线程中的暂停/恢复状态

我想使用BehaviorSubject<Boolean>as触发器并将此触发器绑定到activity onResumeonPause事件.(附加代码示例)

我已经设置了一些东西,但它没有按预期工作.我用它如下:

Observable o = ...;
// Variant 1
o = o.lift(new RxValve(getPauser(), 1000, getPauser().getValue())
// Variant 2
// o = o.compose(RXPauser.applyPauser(getPauser()));
o
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe();
Run Code Online (Sandbox Code Playgroud)

目前的问题是,Variant 1应该可以正常工作,但有时,事件只是没有发出 - 阀门没有发射,直到阀门一切正常工作(可能是一个穿线问题......)!解决方案2更简单,似乎有效,但我不确定它是否真的更好,我不这么认为.我实际上不确定,为什么解决方案有时会失败,所以我不确定解决方案2是否解决了(目前对我不知道)问题...

有人可以告诉我可能是什么问题或者简单的解决方案应该可靠地工作吗?或者给我一个可靠的解决方案?

RxValue

https://gist.github.com/akarnokd/1c54e5a4f64f9b1e46bdcf62b4222f08

RXPauser功能

public static <T> Observable.Transformer<T, T> applyPauser(Observable<Boolean> pauser)
{
    return observable -> pauser(observable, pauser);
}

private static <T> Observable<T> pauser(Observable<T> source, Observable<Boolean> pauser)
{
    // this observable buffers all items that are emitted while …
Run Code Online (Sandbox Code Playgroud)

android observable rx-java

16
推荐指数
1
解决办法
958
查看次数

侦听用户更改的事件(多用户设备)

我有一个应用程序,如果手机启动自动启动.一位用户告诉我他的手机是由两个人使用的,其中一个正在使用我的应用而另一个则没有.

因此,当用户切换时,我需要一些事件来收听,以便在正确的用户使用手机时我可以启动我的应用服务.我能用什么呢?

编辑

我正在通过清单中注册的广播接收器来监听启动事件,所以我知道这是什么.但我找不到任何适合在设备上切换用户的东西

android broadcastreceiver

16
推荐指数
1
解决办法
300
查看次数

Gradle构建完成了200个错误 - 在android studio中更改限制

主要问题

主要问题仍然没有答案:有没有办法改变在android studio中打印到控制台的限制?

老内容

我正在使用代码生成库.因此,单个错误可能会突然导致数百个错误,从而导致此单个错误.

目前我遇到的问题是我找不到错误,因为我得到200个错误 error: cannot find symbol class ......

如何将200的限制更改为更大的数字?

编辑

没有代码,因为它是一个android工作室问题

EDIT2

我知道,如果我打开一个xml文件并插入一些无效的代码(偶然),就会发生这种情况.它只是偶然发生...问题是,android studio在实际错误源可见之前停止将错误写入错误输出控制台...

解决我的问题

在我的特殊情况下,我向类添加了一个字段并将其声明为私有.这导致了问题,即parcelable的代码生成器失败了.它会输出错误,但由于200个错误限制而无法看到...

android gradle android-studio

15
推荐指数
2
解决办法
4200
查看次数

Gradle - 选择模块编译(否则重用jar)

我在我的项目中使用了很多模块(本地和在线的模块,大多数时候都是20个),我可以说通常不会检查或重新编译它们.我可以将它们全部包含在.jar可以加快构建时间的文件中,但我更喜欢以下内容:

  • 设置我定义gradle应.jar为我的所有模块构建并重用它们的东西
  • 如果需要我只是禁用此设置并构建我的项目(完美的干净构建会这样做)
  • 我希望能够在项目中编辑我的模块,这就是为什么我不想将它们直接包含在.jar文件中.

我想要更快的构建时间,但我不想构建.jar文件并手动将它们添加到我的项目中.

关于如何以及如果可能的任何想法?我可以通过一些设置或通过gradle任务或类似的方式来实现吗?

android gradle android-gradle-plugin gradle-task

15
推荐指数
1
解决办法
235
查看次数

Oreo(API 26) - drawOverlay +绘制状态栏

在android oreo中,我不能再使用WindowManager.LayoutParams.TYPE_SYSTEM_ERROR了,必须使用WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY.缺点是,此模式不会覆盖状态栏.

反正有没有实现旧的行为,并能够绘制状态栏?我有一个侧边栏应用程序,直到现在,我允许用户在屏幕顶部也有触发区域,现在不再工作,因为状态栏现在重叠在顶部的可触摸区域...

我对任何解决方案感兴趣,即使它仅适用于某些设备,例如root设备......因为我认为这个问题没有正常的解决方案,因为android系统不再允许这样做,如文档中所述(https://developer.android.com/about/versions/oreo/android-8.0-changes.html#o-apps).不过,这并不意味着没有替代解决方案......

permissions android overlay android-windowmanager android-8.0-oreo

15
推荐指数
1
解决办法
3620
查看次数

searchview在FIRST背面没有正确关闭(它只是失去焦点)

我必须按两次后退按钮才能关闭SearchView.为什么?在第一次出版时,SearchView唯一失去焦点......

设置setOnKeyListenerSearchView也不行...

顺便说一句,我正在使用ABS实施......

我的代码很简单,如下所示:

mMenuItemSearch = menu.findItem(R.id.search);
mSearchView = new SearchView(getSupportActionBar().getThemedContext());
mMenuItemSearch.setActionView(mSearchView);

mSearchView.setOnQueryTextListener(new SearchView.OnQueryTextListener()
{
    public boolean onQueryTextChange(String newText)
    {
        mPagerManager.getFragment(mSelectedPos).adapter.getFilter().filter(newText);
        return true;
    }

    public boolean onQueryTextSubmit(String query)
    {
        return true;
    }
});
Run Code Online (Sandbox Code Playgroud)

android actionbarsherlock android-actionbar searchview

14
推荐指数
1
解决办法
3347
查看次数

通用图像加载器 - 从缓存中删除单个图像不工作

我在加载图片之前调用以下代码:

String url = getUrlImageIcon();
MemoryCacheUtil.removeFromCache(url, ImageLoader.getInstance().getMemoryCache());
DiscCacheUtil.removeFromCache(url, ImageLoader.getInstance().getDiscCache());

ImageLoader.getInstance().displayImage(url, imageView, listener);
Run Code Online (Sandbox Code Playgroud)

我的问题是,这不是从缓存中删除图像,图像加载器仍然显示旧图像...旧图像甚至不再存在于服务器上...

如何正确删除图像中的所有缓存文件?

PS:我正在使用最新的1.9.1版......

android universal-image-loader

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

尽可能防止活动被破坏

我有一个应用程序,一个包含片段的活动应用程序.

这个应用程序的通常用例是,你启动它并把电话拿走,不时,你回到手机并插入一些数据......这是一个日志应用程序,你正在做一些事情并插入你的结果进入应用程序...

我有问题,不时,我的活动被摧毁,并用空包重新创建......(大多数时候情况并非如此,但不时发生这种情况......).我的应用程序有时会启动服务,即使这种服务在这种情况下被杀死...

这意味着系统已杀死我的应用程序,是吗?我怎么能避免这个?

我需要保留用户数据和当前的顶级片段...并且它们被保存到捆绑包中,只要状态和数据得到保存,一切都会正常工作......

顺便说一句,我的活动始终是TOP ACTIVITY,只是屏幕经常关闭......我只想让我的活动尽可能长时间活着,直到用户离开后面的按钮......或者保存状态可靠

重要的提示

onSaveInstance并不总是有效(它不是生命周期的一部分,因此不能保证被调用)...它只能在大多数情况下工作......我需要一种方法来始终工作...如果android杀了我的应用程序. ..

android fragment android-lifecycle android-activity

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

片段 - 我应该在onCreateView中重用视图,我该怎么做?

实际上,我总是在我的片段中重用我的视图,如下所示:

private View mView = null;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
    if (mView == null)
        mView = inflater.inflate(R.layout.view);
    return mView;
}
Run Code Online (Sandbox Code Playgroud)

这有效,有viewpager等.现在我开始在简单的活动中使用我的片段,如果,并且只有当我将片段添加到backstack时,这将因为java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.

所以我的问题是:

  • 没关系,如果我检查父级视图,删除它并将其添加到新父级?
  • 或者我应该总是重新创建视图并且永远不会重复使用它?如果是,为什么?
  • 还有其他要点,重复使用视图会失败吗?

android view reusability android-fragments

13
推荐指数
2
解决办法
5580
查看次数