我有问题使我的片段通过Activity使用FragmentPagerAdapter,作为帮助类来实现对标签的管理以及连接ViewPager关联的所有细节TabHost.我的实现FragmentPagerAdapter与Android示例项目Support4Demos提供的一样.
主要问题是FragmentManager当我没有Id或Tag时,如何从特定片段中获取特定片段?FragmentPagerAdapter正在创建片段并自动生成Id和标签.
对于我的Android项目,我需要全局单例Cache对象来通过应用程序访问有关用户的数据.
当应用程序进入后台并且在使用其他应用程序一段时间后我尝试在Cache对象中打开应用程序变量时出现问题.当我杀死应用程序并再次打开它时,一切都很好.我正在使用依赖注入来访问Cache对象.如果发生这种情况,为什么app不会再次启动?是否有一些注释可以在低内存条件下保持缓存变量?
这是我的Cache类
class Cache {
var categories : Array<BaseResponse.Category>? = null
var user : BaseResponse.User? = null
var options : BaseResponse.OptionsMap? = null
var order: MenuOrderDataModel? = null
}
Run Code Online (Sandbox Code Playgroud)
这是DI的存储模块
@Module class StorageModule {
@Singleton @Provides fun getSharedPrefs(context: Context): SharedPreferences {
return PreferenceManager.getDefaultSharedPreferences(context)
}
@Singleton @Provides fun getCache() : Cache = Cache()
}
Run Code Online (Sandbox Code Playgroud)
我注入对象@Inject lateinit var cache: Cache,然后在启动画面中填充用户数据.
编辑 - 从应用程序和启动活动添加的代码片段
class MyApp : Application() {
val component: ApplicationComponent by lazy {
DaggerApplicationComponent
.builder()
.appModule(AppModule(this))
.build()
} …Run Code Online (Sandbox Code Playgroud) 我有一个使用 ViewPager 显示片段的应用程序的问题。一切正常,直到应用程序进入后台并被操作系统杀死。似乎在恢复之后,我有 2 个处理事件的 IncidentScreenFragment,其中一个带有使我的应用程序崩溃的空演示者 (MVP)。
我的 HomeActivity 看起来像:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
presenter.onViewCreated()
initViews(savedInstanceState)
}
private fun initViews(savedInstanceState: Bundle?){
mapView.onCreate(savedInstanceState)
mapView.getMapAsync(this)
initFragment()
initMenu()
}
private fun initFragment(){
homeFragment = HomeScreenFragment.newInstance()
incidentFragment = IncidentScreenFragment.newInstance()
chatFragment = ChatFragment.newInstance()
weatherFragment = WeatherFragment.newInstance()
viewPager.adapter = ViewPagerAdapter(supportFragmentManager, this)
viewPager.offscreenPageLimit = 4
viewPager?.addOnPageChangeListener(object : ViewPager.OnPageChangeListener {
override fun onPageScrollStateChanged(state: Int) {}
override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {}
override fun onPageSelected(position: Int) {bottom_navigation.currentItem = position}
})
}
override fun …Run Code Online (Sandbox Code Playgroud) 当我启动应用程序时一切正常,但是当我旋转到横向时它崩溃了,因为在Fragment那里有一个字段是NULL.
我不使用setRetainInstance(true)或添加 FragmentsFragmentManager在应用程序启动和应用程序旋转时创建新的 Fragments。
在Activity OnCreate()我创建Fragment并将它们添加到viewPager这样的。
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ParentBasicInfoFragment parentBasicInfoFragment = new ParentBasicInfoFragment();
ParentUTCFragment parentUTCFragment = new ParentUTCFragment();
ParentEventsFragment parentEventsFragment = new ParentEventsFragment();
this.mFragments = new ArrayList<>();
this.mFragments.add(parentBasicInfoFragment);
this.mFragments.add(parentUTCFragment);
this.mFragments.add(parentEventsFragment);
this.viewpage.setOffscreenPageLimit(3);
setCurrentTab(0);
this.viewpage.setAdapter(new MainActivityPagerAdapter(getSupportFragmentManager(), this.mFragments));
}
Run Code Online (Sandbox Code Playgroud)
然后我在应用程序上有一个测试按钮,当我按下它时会像
public void test(View view) {
((BaseFragment) MainActivity.this.mFragments.get(MainActivity.this.viewpage.
getCurrentItem())).activityNotifiDataChange("hello");
}
Run Code Online (Sandbox Code Playgroud)
这将工作和当前Fragments的ViewPager有方法, activityNotifiDataChange()正在调用,一切正常。
当我旋转应用程序并按下按钮做同样的事情时,activityNotifiDataChange()它被调用了,但是有一个空指针异常,因为 ArrayList<Fragment> mFragment它现在是 NULL。
这是一个显示此行为的小示例 Android …