学习andriod开发之 关于对话框

       大家好 我是akira 最近项目比较忙 也是没有时间写博客 有人说让我做下关于对话框的 我觉得吧

像我这种菜鸟 被人认同也是非常激动 昨天看了看系统调用相册的 全是接口套接口 被打击的不清  所以说 

路还很长 不多说了 开始今天的学习。

默认的对话框

       对话框是程序Ui中不可缺少的一部分 一个好的软件都有对话框 我们看在我们进行登录的时候 有登录对话框 

在程序要升级的时候有升级对话框 在进行闹钟提醒的时候 有提醒对话框 而甚至在我们玩游戏的时候也能看到各种各样的动态对话框 

来进行一个引导作用 在andriod开发中也有各种各样的对话框 掌握好它们无疑是必须课 

来写一个简单的对话框

 

private void initView() {
			findViewById(R.id.button).setOnClickListener(new OnClickListener() {
				@Override
				public void onClick(View v) {
					AlertDialog.Builder dialog = new Builder(context);
					dialog.setTitle("我是一个对话框");
					dialog.setPositiveButton("确定",new DialogInterface.OnClickListener() {
						
						@Override
						public void onClick(DialogInterface dialog, int which) {
					        
							showToast("确定");
						}
					});
					dialog.setNegativeButton("取消", new DialogInterface.OnClickListener() {
						
						@Override
						public void onClick(DialogInterface dialog, int which) {
							dialog.dismiss();
						}
					});
					dialog.show();
				}
			});
	}
布局文件就一个按钮 不看了 

我们看到 想要弹出一个简单的对话框 只需要一个builder 我称之为建造者 

然后设置确定监听或者取消监听即可 最后别忘了show 

效果如下


我们说了 对话框有很多东西 比如我们可以给他加一个图标 特别是用户按两下back键的时候会启动它 

可以调用 dialog.setIcon(icon);方法 等等 

PS: 这里注意 不要在context里面去传getApplicationContext 否则会出现Token为null的情况 

这个上面博客里有讲到 

一个自定义的dialog

     我们说了 需求是万变的 这个时候PM会给你说 OMG 这个对话框太丑了 你得搞好看点 可是这个时候andriod系统已经没有

其他的对话框了 这个时候 我们要自己去加载一个对话框 

用到了一个简单的api setView 

下面代码

 private AlertDialog mDialog;
	private void initViewSetView() {

		findViewById(R.id.button).setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				 AlertDialog.Builder builder = new Builder(context);
				View view =  mInflater.inflate(R.layout.dialog,null);
				view.findViewById(R.id.ok).setOnClickListener(new OnClickListener() {
					
					@Override
					public void onClick(View v) {
						showToast("确定");
						
					}
				});
				view.findViewById(R.id.cancel).setOnClickListener(new OnClickListener() {
					
					@Override
					public void onClick(View v) {
						mDialog.dismiss();
					}
				});
				builder.setView(view);
				mDialog = builder.show();
			}
		});

		
	}

这里面用到了setView方法 我们发现一个变量是mInflute 这其实是一个布局填充器 

关于它的用法 咱以后再讲 这里面调用一个最简单的API 第一个参数传一个布局 第二个参数传null 这里先不要问为什么

这里写其实是有问题的 这个以后再讲 

看下效果


bg的效果暂时先这样 但是这个时候PM说话了 这也做得太丑了 

我要好看 同时 我们的应用有20多个这样的对话框 你都要加上 

这个时候问题来了 我们要探讨的并不是挖掘机哪家强 而是我们难道非得一定要将同样的代码写20遍? 

自定义封装对话框

      答案显然是否定的 因为进阶高手的必经之路都是代码的复用性 这点毋庸置疑 真实开发中都是自定义view 因此 我们的对话框也需要进行自定义

如果你看过之前的博客 一定知道自定义view 一定要实现三个构造 有可能还需要一些自定义属性 

首先 这里提一点 自定义view的写法有两种 如果你了解过fragment 一定知道写一个fragment可以有一个class属性 

同样 自定义view的第一种写法也需要一个class属性 因为是自定义view 所以需要声明view节点即可

自定义view的第二种写法相比你已经很熟悉了 即包名+类名为节点 然后各种属性 我们以后也会进行自定义view更深入的学习 

这里由于是dialog 而dialog的属性就是不一定会显示 所以我们的布局文件中没必要去声明它 好的 废话不多说 看下这个dialog用自定义view

怎么写

下面代码

public class MyDialog extends Dialog implements android.view.View.OnClickListener {

	private TextView ok;
	private TextView cancel;
	public MyDialog(Context context) {
		super(context);
	}


	public MyDialog(Context context, int theme) {
		super(context, theme);
	}
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.dialog);
	}
	public void setTtitle(String content){
		((TextView)findViewById(R.id.title)).setText(content);
	}
	public void setPositive(String content){
		if(ok==null)
		ok = ((TextView)findViewById(R.id.ok));
		ok.setText(content);
	}
	public void setNagetive(String content){
		if(cancel==null)
		cancel = ((TextView)findViewById(R.id.cancel));
		cancel.setText(content);
	}
	public void setPositiveClick(){
		if(ok!=null){
			ok.setOnClickListener(this);
		}
	}
	public void setNagetiveClick(){
		if(ok!=null){
			cancel.setOnClickListener(this);
		}
	}


	@Override
	public void onClick(View v) {
		switch (v.getId()) {
		case R.id.ok:
			SoftUtil.showToast(getContext(), "OK");
			break;
		case R.id.cancel:
			dismiss();
			break;

		default:
			break;
		}
		
	}
	
	

}


这里我们没必要都去实现构造 但是单参是必须的  然后 TextView 没错 你看到的都是TextView 

我们没有用传统的button或者imageButton 因为目前为止TextView足以代替button实现所有功能 

然后onCreate 是的 dialog也有自己的生命周期 关于这点以后说明 

这里面可以进行设置布局的方式 然后我们可以模仿系统实现setTitle 等方法 


23号继续更新 。。。

这篇差点烂尾~~~ 话不多说 直接上代码 ps:重写了一下 前面的工程给搞丢了 这次好看很多

首先是我们的首页

public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        TextView tv_al = (TextView) findViewById(R.id.tv_al);
        tv_al =  calluteFont(tv_al);
        tv_al.setOnClickListener(new MyOnclickLister());
    }

    /**
     * 处理文字
     * @param tv
     */
    private TextView calluteFont(TextView tv) {
        tv.setFocusable(true);
        tv.setClickable(true);
        Typeface tf = Typeface.createFromAsset(getAssets(), "fonts/lucky.ttf");
        tv.setTypeface(tf);
        return  tv;
    }



    class MyOnclickLister implements View.OnClickListener{


        @Override
        public void onClick(View view) {
            MyDialog dialog = new MyDialog(MainActivity.this,R.style.MyDialog);
            dialog.setTitle("dialog");
            dialog.show();

        }
    }

}

前面我们讲过了span 这次我们就用这个自定义字体

其他的都差不多 我们发现这里我们自定义了一个MyDialog 当然你也可以起别的名字 

而这里面除了设置title和show以外再无其他方法!

封装就是尽量做到极致 何谓面向对象的思想 就是谁拥有谁处理 

简单的例子就是 比如去饭馆吃饭 我点了一个菜发现不好吃 

我让师傅重新回一下锅 此时回锅具体怎么做 只有师傅知道 

我不可能亲自拿上炒勺跑到厨房去参呼去 这不合适 不是么 

封装也是一样的道理

看下MyDialog的代码

/**
 * Created by akira on 2015/1/23.
 */
public  class MyDialog extends Dialog implements View.OnClickListener {
    private Button ok;
    private Button cancel;
    public MyDialog(Context context) {
        super(context);
    }

    public MyDialog(Context context, int theme) {
        super(context, theme);
    }


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.malter);
        ok =  ((Button)findViewById(R.id.queren));
        cancel =  ((Button)findViewById(R.id.qvxiao));
        ok.setOnClickListener(this);
        cancel.setOnClickListener(this);
    }
    public void setTtitle(String content){
        ((TextView)findViewById(R.id.toast_title)).setText(content);
    }

    public  void setPositiveClick(){
        NeedUtils.showToast(getContext(), "ok", Toast.LENGTH_SHORT);
    };
    public  void setNagetiveClick(){
        NeedUtils.showToast(getContext(),"cancel", Toast.LENGTH_SHORT);
    };


    @Override
    public void onClick(View view) {

            switch (view.getId()) {
                case R.id.queren:
                    this.dismiss();
                    setPositiveClick();
                    break;
                case R.id.qvxiao:
                    this.dismiss();
                    setNagetiveClick();
                    break;
                default:
                    break;
            }


    }
}

这里做到的就是讲对话框的点击作为了view的点击事件 从而实现相关逻辑

我们的想法是点击后 出一个吐司 

传统吐司谁都会写 毫无意义 来写一个自定义吐司吧 (ps:这太常用了)

看下代码

/**
     * 自定义
     * @param context
     * @param alert
     * @param time
     */
    public static void showToast(Context context,String alert,int time){
        //得到填充器
        LayoutInflater inflater =  LayoutInflater.from(context);
        View parent =  inflater.inflate(R.layout.mtoast,null);
        TextView adavise = (TextView) parent.findViewById(R.id.advise);
        ImageView alertimg = (ImageView) parent.findViewById(R.id.alertimg);
        adavise.setText(alert);
         if(!TextUtils.isEmpty(alert)){
             if (alert.equals("ok"))
                 alertimg.setImageResource(R.drawable.gin1);
               else if(alert.equals("cancel"))
                 alertimg.setImageResource(R.drawable.gin2);
             else
                 alertimg.setImageResource(R.drawable.gin3);
         }
        Toast toast = new Toast(context);
        //设置位置
        toast.setGravity(Gravity.CENTER,0,0);
        toast.setDuration(time);
        toast.setView(parent);
        toast.show();

    }

现在发现 任何的自定义都需要去填充 填充就需要一个工具 这个工具俗称布局填充器 

我更喜欢称之为打气筒 

下面就是一个简单的判断 首选传进来的东西必须存在 其次根据你的点击内容来设置图

new 一个吐司出来 设置他的位置 最后show出来

忘了布局代码

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_gravity="center"
    android:gravity="center"
    android:orientation="vertical"
    >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:padding="10dp"
        android:orientation="vertical"
        android:background="@color/light_blue">

        <TextView
            android:id="@+id/al_title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="title"
            android:textSize="25sp"
            android:textColor="@color/white"
            />

        </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/black"
        android:orientation="horizontal"
        >

        <Button
            android:id="@+id/queren"
            android:layout_weight="1"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:text="确认"
            android:textSize="20sp"
            android:textColor="@color/white"
            android:layout_marginLeft="10dp"
            />

        <Button
            android:id="@+id/qvxiao"
            android:layout_weight="1"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:text="取消"
            android:textSize="20sp"
            android:textColor="@color/white"
            android:layout_marginRight="10dp"
            />

    </LinearLayout>

</LinearLayout>
吐司的代码

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="100dp"
    android:layout_centerInParent="true"
    >


    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@drawable/titleback"
        android:gravity="center"
        android:orientation="vertical"
        android:padding="10dp"
        >

        <TextView
            android:id="@+id/toast_title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="title"
            android:textSize="20sp"
            android:textStyle="bold"
            android:textColor="@android:color/white"
            />

        </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="10dp"
        android:background="@drawable/backcontent"
        android:orientation="vertical"
        android:gravity="center"
        >

        <ImageView
            android:id="@+id/alertimg"
            android:layout_width="140dp"
            android:layout_height="110dp"
            android:src="@drawable/gin1"
            android:scaleType="center"
            />

        <TextView
            android:id="@+id/advise"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:text="111"
            android:textSize="20sp"
            android:textColor="@android:color/white"
            />

    </LinearLayout>


</LinearLayout>

里面的背景仅仅是一个shape 

看下效果吧


那么问题来了 难道仅仅如此么 我还觉得不够爽怎么办 这里来一个视频

视频对话框

说道视频 我们知道 视频一般用到的是surfaceView或者videoView前者不是这次的重点 

咱用videoView玩一下视频

ps:播放视频为本地 因网络视频牵扯到rsvp流或者加密等方面 后期有机会再讲

看下对话框代码改造

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_gravity="center"
    android:gravity="center"
    android:orientation="vertical"
    >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:padding="10dp"
        android:orientation="vertical"
        android:background="@color/light_blue">

        <TextView
            android:id="@+id/al_title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="title"
            android:textSize="25sp"
            android:textColor="@color/white"
            />

        </LinearLayout>

    <FrameLayout
        android:layout_width="wrap_content"
        android:layout_height="220dp"
        android:gravity="center"
        android:padding="5dp"
        android:background="@color/light_blue"
        >

        <VideoView
            android:id="@+id/video"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            />

    </FrameLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/black"
        android:orientation="horizontal"
        >

        <Button
            android:id="@+id/queren"
            android:layout_weight="1"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:text="确认"
            android:textSize="20sp"
            android:textColor="@color/white"
            android:layout_marginLeft="10dp"
            />

        <Button
            android:id="@+id/qvxiao"
            android:layout_weight="1"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:text="取消"
            android:textSize="20sp"
            android:textColor="@color/white"
            android:layout_marginRight="10dp"
            />

    </LinearLayout>

</LinearLayout>

下来是代码的改造

/**
 * Created by akira on 2015/1/23.
 */
public  class MyDialog extends Dialog implements View.OnClickListener {
    private Button ok;
    private Button cancel;
    private VideoView video;
    public MyDialog(Context context) {
        super(context);
    }

    public MyDialog(Context context, int theme) {
        super(context, theme);
    }


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.malter);
        ok =  ((Button)findViewById(R.id.queren));
        cancel =  ((Button)findViewById(R.id.qvxiao));
        video  = (VideoView) findViewById(R.id.video);
        MediaController controller = new MediaController(getContext());
        video.setMediaController(controller);
        String path = "file:///storage/emulated/0/banner/shan.mp4";
        video.setVideoURI(Uri.parse(path));
        video.start();
        /**
         * 播放完成回调
         */
        video.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mp) {
                NeedUtils.showToast(getContext(),"完成",Toast.LENGTH_SHORT);
            }
        });
        /**
         * 播放错误回调
         */
        video.setOnErrorListener(new MediaPlayer.OnErrorListener() {

            @Override
            public boolean onError(MediaPlayer mp, int what, int extra) {
                NeedUtils.showToast(getContext(),"错误",Toast.LENGTH_SHORT);
                return false;
            }
        });
        ok.setOnClickListener(this);
        cancel.setOnClickListener(this);
    }
    public void setTtitle(String content){
        ((TextView)findViewById(R.id.toast_title)).setText(content);
    }

    public  void setPositiveClick(){
        NeedUtils.showToast(getContext(), "ok", Toast.LENGTH_SHORT);
    };
    public  void setNagetiveClick(){
        NeedUtils.showToast(getContext(),"cancel", Toast.LENGTH_SHORT);
    };


    @Override
    public void onClick(View view) {

            switch (view.getId()) {
                case R.id.queren:
                    this.dismiss();
                    setPositiveClick();
                    break;
                case R.id.qvxiao:
                    this.dismiss();
                    setNagetiveClick();
                    break;
                default:
                    break;
            }


    }

}

这里说下 videoView 他身上有开播的方法 和播放完成以及错误的回调 

如果要设置进度条 就要手动去写mediaConXXX这个类 然后实现比如进度条的实现或者声音解码

甚至弹幕的调节 

看下效果吧!


本期就到这里 各位下期再见

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值