Android Fragment切换 和 数据懒加载的分离处理
来源:互联网 发布:电脑锣编程代码 编辑:程序博客网 时间:2024/06/06 15:44
不用FragmentTransaction的replace方法,每次都初始化加载fragment
改用add,已经add时就show(); 没有add时就hide()
activity的
@Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); logi("main-oncreate"); // First time init, create fragment if (savedInstanceState == null) { mMainFragment = new MainFragment(); mMyFragment = new MyFragment(); mMoreFragment = new MoreFragment(); mContentFrag = mMainFragment; getSupportFragmentManager().beginTransaction().add(R.id.layout_frag_conent, mContentFrag).commit(); } }
切换fragment:
private void switchFragment(Fragment from, Fragment to) { if (mContentFrag != to) { mContentFrag = to; android.support.v4.app.FragmentTransaction transaction = getSupportFragmentManager(). beginTransaction().setCustomAnimations( android.R.anim.slide_in_left, android.R.anim.slide_out_right); if (!to.isAdded()) { // 先判断是否被add过 transaction.hide(from).add(R.id.layout_frag_conent, to).commit(); // 隐藏当前的fragment,add下一个到Activity中 } else { transaction.hide(from).show(to).commit(); // 隐藏当前的fragment,显示下一个 } } }
下面的官方例子就实现了,当数据不需要一上来就加载时,可以将ui操作放入一个fragment;
加载数据操作放入另一个fragment。当触发click事件时,才启动工作的fragment中的加载数据方法
并且在configuration-changed时,保留操作数据的fragment。
ApiDemo下的FragmentRetainInstance
/* * Copyright (C) 2010 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */package com.example.android.apis.app;import com.example.android.apis.R;import android.app.Activity;import android.app.Fragment;import android.app.FragmentManager;import android.os.Bundle;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.ProgressBar;/** * This example shows how you can use a Fragment to easily propagate state * (such as threads) across activity instances when an activity needs to be * restarted due to, for example, a configuration change. This is a lot * easier than using the raw Activity.onRetainNonConfiguratinInstance() API. */public class FragmentRetainInstance extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // First time init, create the UI. if (savedInstanceState == null) { getFragmentManager().beginTransaction().add(android.R.id.content, new UiFragment()).commit(); } } /** * This is a fragment showing UI that will be updated from work done * in the retained fragment. */ public static class UiFragment extends Fragment { RetainedFragment mWorkFragment; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v = inflater.inflate(R.layout.fragment_retain_instance, container, false); // Watch for button clicks. Button button = (Button)v.findViewById(R.id.restart); button.setOnClickListener(new OnClickListener() { public void onClick(View v) { mWorkFragment.restart(); } }); return v; } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); FragmentManager fm = getFragmentManager(); // Check to see if we have retained the worker fragment. mWorkFragment = (RetainedFragment)fm. // If not retained (or first time running), we need to create it. if (mWorkFragment == null) { mWorkFragment = new RetainedFragment(); // Tell it who it is working with. mWorkFragment.setTargetFragment(this, 0); fm.beginTransaction().add(mWorkFragment, "work").commit(); } } } /** * This is the Fragment implementation that will be retained across * activity instances. It represents some ongoing work, here a thread * we have that sits around incrementing a progress indicator. */ public static class RetainedFragment extends Fragment { ProgressBar mProgressBar; int mPosition; boolean mReady = false; boolean mQuiting = false; /** * This is the thread that will do our work. It sits in a loop running * the progress up until it has reached the top, then stops and waits. */ final Thread mThread = new Thread() { @Override public void run() { // We'll figure the real value out later. int max = 10000; // This thread runs almost forever. while (true) { // Update our shared state with the UI. synchronized (this) { // Our thread is stopped if the UI is not ready // or it has completed its work. while (!mReady || mPosition >= max) { if (mQuiting) { return; } try { wait(); } catch (InterruptedException e) { } } // Now update the progress. Note it is important that // we touch the progress bar with the lock held, so it // doesn't disappear on us. mPosition++; max = mProgressBar.getMax(); mProgressBar.setProgress(mPosition); } // Normally we would be doing some work, but put a kludge // here to pretend like we are. synchronized (this) { try { wait(50); } catch (InterruptedException e) { } } } } }; /** * Fragment initialization. We way we want to be retained and * start our thread. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Tell the framework to try to keep this fragment around // during a configuration change. setRetainInstance(true); // Start up the worker thread. mThread.start(); } /** * This is called when the Fragment's Activity is ready to go, after * its content view has been installed; it is called both after * the initial fragment creation and after the fragment is re-attached * to a new activity. */ @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); // Retrieve the progress bar from the target's view hierarchy. mProgressBar = (ProgressBar)getTargetFragment().getView().findViewById( R.id.progress_horizontal); // We are ready for our thread to go. synchronized (mThread) { mReady = true; mThread.notify(); } } /** * This is called when the fragment is going away. It is NOT called * when the fragment is being propagated between activity instances. */ @Override public void onDestroy() { // Make the thread go away. synchronized (mThread) { mReady = false; mQuiting = true; mThread.notify(); } super.onDestroy(); } /** * This is called right before the fragment is detached from its * current activity instance. */ @Override public void onDetach() { // This fragment is being detached from its activity. We need // to make sure its thread is not going to touch any activity // state after returning from this function. synchronized (mThread) { mProgressBar = null; mReady = false; mThread.notify(); } super.onDetach(); } /** * API for our UI to restart the progress thread. */ public void restart() { synchronized (mThread) { mPosition = 0; mThread.notify(); } } }}
0 0
- Android Fragment切换 和 数据懒加载的分离处理
- Android中Fragment的动态加载和双屏切换问题
- 关于Fragment的加载和切换问题
- Android之Fragment的切换不对Fragment进行重新加载
- Android之Fragment的切换不对Fragment进行重新加载
- Android fragment 切换加载数据卡顿问题
- Android中横竖屏切换加载不同布局导致fragment数据丢失的问题
- android中在切换fragment时,怎样做到无需重复加载数据的方法。
- viewpager+fragment的懒加载实现微信点击和滑动切换功能(切换效果)
- fragment 的懒加载数据
- 解决RadioButton+FragmentPagerAdapter+Fragment切换页面数据加载的问题
- Android ViewPager + Fragment 懒加载处理
- android fragment的切换
- 【Android】Fragment懒加载和ViewPager的坑
- 【Android】Fragment懒加载和ViewPager的坑
- 【Android】Fragment懒加载和ViewPager的坑
- Fragment懒加载数据
- Fragment-Fragment切换的数据刷新问题
- H5页面设计
- HotSpot是什么?
- TimSort算法相关
- Android中WebView的使用方法
- Android Studio 常用插件
- Android Fragment切换 和 数据懒加载的分离处理
- H5页面设计
- http请求和数据丢失问题
- AJAX
- NSURLConnection 文件下载的BUG及解决思路、方案
- PorterDuffXferMode不正确的真正原因PorterDuffXferMode深入试验)
- oracle----------数据类型,增删改
- 1.XML 简介
- poj 1979 Red and Black