zoukankan      html  css  js  c++  java
  • 把网络请求加载过程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; 这样就能够把问题解决了。

  • 相关阅读:
    js的元素对象
    js实现在末尾添加节点
    js实现点击增加文本输入框
    js的DOM对象
    js其它
    js实现99乘法表
    js
    http的六种请求方法
    11.进制
    10.Debug
  • 原文地址:https://www.cnblogs.com/jinfenglee/p/4388704.html
Copyright © 2011-2022 走看看