之所以有这种需求,是因为我们自己写一个工具类继承dialog,在网络请求的时候进行dialog的show() 或者dismiss(),但是会出现一个问题:当在进行网络请求的时候进行横竖屏切换就会出现dialog找不到底部的view, 也就会出现程序崩溃的问题。 尤其是SAMSUNG平板的横竖屏和我们常见平板的横竖屏完全是相反的。
如果想要使出现的加载过程与Activity无关,请看第四种思路。
大致有三种思路:
一、 首先我们想到的就是Activity被销毁了,那我们在进行横竖屏切换的时候不让他销毁不就会出现这种问题了。
在manifest中对Activity进行配置:
android:configChanges="screenSize|orientation"
二、 在每一次我们对dialog进行show()的时候,判断当前Dialog所属的Activity是否销毁,这种方式也可以,但是每一个show()都添加一个判断,代码会很臃肿。这个方法也是网上最常用的方法。
if(**Activity.isFinishing()){ xxx }
三、 把加载过程做成一个view,继承View,在view中跑一个动画,在需要使用加载过程的时候,通过在Activity中创建的LoadingProView,进行show()和hide()操作即可。
这个方式也是最好的一种方式,大家可以试试。
方式如下:
import com.wonhigh.base.R; import android.content.Context; import android.graphics.drawable.AnimationDrawable; import android.view.View; import android.view.ViewGroup; import android.view.ViewParent; import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.TextView; /** * * TODO: 数据请求加载过程 <br> * reference: http://blog.csdn.net/lgl1170860350/article/details/39958421 * * @author xxx * @date 2014-12-12 下午3:54:29 */ public class LoadingProView extends FrameLayout { private View mTarget = null; private AnimationDrawable loadingDrawable = null; private TextView tv_text = null; private ImageView imgView = null; public LoadingProView(Context context, View target) { super(context); mTarget = target; inflate(context, R.layout.loading_view, this); imgView = (ImageView) findViewById(R.id.loading_img); loadingDrawable = (AnimationDrawable) imgView.getDrawable(); tv_text = (TextView) findViewById(R.id.loading_text); setVisibility(View.GONE); ViewGroup.LayoutParams lp = mTarget.getLayoutParams(); ViewParent parent = mTarget.getParent(); FrameLayout container = new FrameLayout(context); ViewGroup group = (ViewGroup) parent; int index = group.indexOfChild(mTarget); group.removeView(mTarget); group.addView(container, index, lp); container.addView(mTarget); container.addView(this); group.invalidate(); } public void setText(CharSequence text) { tv_text.setText(text); } public void show() { setVisibility(View.VISIBLE); loadingDrawable.start(); } public void hide() { setVisibility(View.GONE); loadingDrawable.stop(); } public boolean isShown() { return getVisibility() == View.VISIBLE; } private View.OnClickListener interceptListener = new View.OnClickListener() { @Override public void onClick(View v) { // do nothing } }; /** * 设置loading显示时是否拦截点击事件<br/> * @param flag true:拦截 */ public void interceptClick(boolean flag) { setOnClickListener(flag ? interceptListener : null); } }
在使用该网络请求loading加载的Activity中:
loadingProView = new LoadingProView(this, findViewById(R.id.activity_root_layout_id));然后在相应的地方使用show(), hide()就可以了。
四、 可以使用相对布局,当出现网络请求加载的时候让加载动画的布局visible,加载完成后设置invisible。
但是这又出现一个问题:如果在加载的过程中,我点击返回键,这时不仅这个加载页面没有了,后面的Activity对应的页面也没有了。此时我们应该重写onKeyDown(),判断上面的布局是否存在,如果不存在,直接return true; 否则,隐藏布局,并且 return false; 这样就能够把问题解决了。