把网络请求加载过程dialog做成一个View

之所以有这种需求,是因为我们自己写一个工具类继承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; 这样就能够把问题解决了。

posted on 2014-12-17 08:08  jinfenglee  阅读(189)  评论(0编辑  收藏  举报

导航