您的位置:首页 > 理论基础 > 计算机网络

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

2014-12-17 08:08 232 查看
之所以有这种需求,是因为我们自己写一个工具类继承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; 这样就能够把问题解决了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐