Android高级控件

19 篇文章 1 订阅

1.ScrollView(滚动视图)

1.1简介

ScrollView也是一个容器,它是FrameLayout的子类,它的主要作用就是将超出物理屏幕的内容显示出来,(就是滚动条效果)ScrollView提供垂直滚动,进而可将超出物理屏幕的内容显示出来。

      在一般情况下,可以将一个采用垂直方式布局组件的LinearLayout作为ScrollLayout容器的子组件,同时,在LinearLayout容器中可以显示超出屏幕物理高度的内容。
 

1.2注意

1.ScrollView有且只能有一个子view(布局-LinearLayout或RelativeLayout)

2.

如果说子view中的height没有比scrollView高,不能滑动

只能垂直滑动,不能水平滑动,如果想要水平滑动,需要使用HorizatonalScrollView

 

2.progressBar(滚动条)

2.1介绍

进度条是UI界面中一种实用的UI组件,用于显示一个耗时操作显示出来的百分比,进度条可以动态的显示进度,避免是用户觉得系统长时间未反应,提高用户的体验。

2.2分类

主要分为圆形以及水平进度条,水平进度条是确定的,可以看到水平进度,圆形进度条是不确定的,不知道什么时候完成,就一直在那里转。这两者最典型的例子就是文件拷贝可以用水平进度条看到文件拷贝的进度,圆形进度条则主要使用在网络连接上,不知道网络连接成功的时间,就一直在那里尝试连接,可以显示一直在那里转。
 

2.3使用

 3.PopupWindow(弹出框)

3.1可以加载一个view或者导入自定义的xml布局

3.2使用

xml层

 Mainactivity层

 3.3如何导入一个自定义布局

首先要创建一个xml文件

 

 在Java代码层编写代码

public class MainActivity3 extends AppCompatActivity {
    Button btn_test;
    Button btn_test2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main3);
        btn_test = findViewById(R.id.btn_test);
        btn_test2 = findViewById(R.id.btn_test2);

        TextView textView = new TextView(MainActivity3.this);
        textView.setText("嫩爹来喽!!!");

        PopupWindow popupWindow = new PopupWindow(textView,200,300);
        popupWindow.setOutsideTouchable(true);

        btn_test.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                popupWindow.showAsDropDown(btn_test);
            }
        });
        //将xml文件转化成view
        View popup_item = getLayoutInflater().inflate(R.layout.popup_item,null);
        PopupWindow popupWindow2 = new PopupWindow(popup_item,200,300);
        //设置点击外部取消
        popupWindow2.setOutsideTouchable(true);
        //设置背景图
        popupWindow2.setBackgroundDrawable(getResources().getDrawable(R.drawable.ic_launcher_background));
        btn_test2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //显示弹出框
                popupWindow2.showAsDropDown(btn_test2);
            }
        });
    }
}

4.Dialog(对话框)

4.1Dialog与PopupWindow的区别

1.两者相同点
1.1 都可以设置对话框
1.2 都可以设置呈现各种弹窗样式

2.两者区别
本质区别:

Dialog是非阻塞式对话框,AlertDialog弹出时后台还可以做其他事情;
popupwindow是阻塞式对话框,popupwindow弹出时程序会等待,在popupwindow结束前程序会一直等待,当调用dismiss方法后popupwindow弹窗关闭程序才向下进行
代码实现区别:

Dialog实现底部弹窗

public class BottomDialog extends Dialog implements View.OnClickListener {

    private Context context;
    private TextView tvCall;
    private String name;
    private String phone_number;
    private TextView tv_contact_customer;
    private TextView tv_cancel;

    public BottomDialog(@NonNull Context context, String name, String phone_number, @StyleRes int themeResId){
        super(context, themeResId);
        this.context = context;
        this.name = name;
        this.phone_number = phone_number;
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.layout_contact_phone_dialog);//弹窗布局
        if (this.getWindow() != null) {
            WindowManager.LayoutParams layoutParams = getWindow().getAttributes();
            layoutParams.gravity = Gravity.BOTTOM;//底部弹出
            layoutParams.width = RelativeLayout.LayoutParams.MATCH_PARENT;
            layoutParams.height = RelativeLayout.LayoutParams.WRAP_CONTENT;
            getWindow().getDecorView().setPadding(0, 0, 0, 0);
            getWindow().setAttributes(layoutParams);
            //getWindow().setWindowAnimations(R.style.DialogAnimation);//view中添加动画
        }
        tvCall = findViewById(R.id.call_service);
        tv_contact_customer = findViewById(R.id.tv_contact);
        tv_cancel = findViewById(R.id.tv_close);
        tv_cancel.setOnClickListener(this);
        tv_contact_customer.setOnClickListener(this);
        tvCall.setOnClickListener(this);
    }


    @Override
    public void onClick(View view) {
        if (view.getId() == R.id.call_service) {
            if (onCallSalesListener != null) {
                onCallSalesListener.onCallSalesman();
            }
        }
        if (view.getId() == R.id.tv_contact) {
            if (onCallSalesListener != null) {
                onCallSalesListener.onContactCustomerService();
            }
        }
        if (view.getId() == R.id.tv_close) {
            dismiss();
        }
    }

    //监听接口
    public interface OnCallSalesListener {
        void onCallSalesman();

        void onContactCustomerService();
    }

    private OnCallSalesListener onCallSalesListener;

    public void setOnCallSalesListener(OnCallSalesListener onCallSalesListener) {
        this.onCallSalesListener = onCallSalesListener;
    }
    
}

popupwindow实现底部弹窗:

public class BottomPopWindow extends PopupWindow implements View.OnClickListener{


    private View mMenuView;
    //文本信息
    private TextView tv_prompt_info;
    private final RelativeLayout rl_close;
    private final TextView tv_close;

    public BottomPopWindow(final Context context) {
        super(context);
        mMenuView = View.inflate(context,R.layout.layout_bottom_pop,null);
        //提示信息内容
        tv_prompt_info = mMenuView.findViewById(R.id.tv_info);
        rl_close = mMenuView.findViewById(R.id.rl_close);
        rl_close.setOnClickListener(this);
        tv_close = mMenuView.findViewById(R.id.tv_close);
        tv_close.setOnClickListener(this);
        tv_prompt_info.setText("寒塘渡鹤影,冷月葬花魂");
        tv_prompt_info.setHighlightColor(context.getResources().getColor(android.R.color.transparent));
        //设置SelectPicPopupWindow的View
        this.setContentView(mMenuView);//设置布局
        //设置弹出窗体的宽和高
        this.setWidth(ViewGroup.LayoutParams.MATCH_PARENT);
        this.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT);
        //返回键可点击
        this.setFocusable(true);
        //外部可点
        this.setOutsideTouchable(true);
        //弹出窗体的背景
        this.setBackgroundDrawable(new ColorDrawable(0xAA000000));
        //动画效果
        this.setAnimationStyle(R.style.DialogAnimation);
        //弹窗dismiss时调用
        this.setOnDismissListener(new OnDismissListener() {
            @Override
            public void onDismiss() {
					//弹窗结束的收尾工作...
            }
        });
    }

    @Override
    public void onClick(View v) {
        if (v.getId()==R.id.rl_close || v.getId()==R.id.tv_close ){
                dismiss();
        }
    }
}

基本的对话框要包含什么内容?

package com.hp.demo;

import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;

import android.content.DialogInterface;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity4 extends AppCompatActivity {
    Button btn_dialog_talk;
    Button getBtn_dialog_talk2;
    Button getBtn_dialog_talk3;
    Button getBtn_dialog_talk4;
    Button getBtn_dialog_talk5;

    private String choice = "";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main4);
        btn_dialog_talk = findViewById(R.id.btn_dialog_talk);
        getBtn_dialog_talk2 = findViewById(R.id.btn_dialog_talk2);
        getBtn_dialog_talk3 = findViewById(R.id.btn_dialog_talk3);
        getBtn_dialog_talk4 = findViewById(R.id.btn_dialog_talk4);
        getBtn_dialog_talk5 = findViewById(R.id.btn_dialog_talk5);

        btn_dialog_talk.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                AlertDialog.Builder dialog = new AlertDialog.Builder(MainActivity4.this)
                        .setTitle("警告")
                        .setMessage("确定删除该条数据吗?")
                        .setNegativeButton("取消", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialogInterface, int i) {
                                Toast.makeText(MainActivity4.this, "取消", Toast.LENGTH_SHORT).show();
                            }
                        })
                        .setPositiveButton("确定", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialogInterface, int i) {
                                Toast.makeText(MainActivity4.this, "取消", Toast.LENGTH_SHORT).show();
                            }
                        });
                dialog.show();
            }
        });
        getBtn_dialog_talk2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String [] types = {"A照","B照","C照","D照"};

                AlertDialog.Builder dialog = new AlertDialog.Builder(MainActivity4.this)
                        .setTitle("请输入你的驾照类型:")
                        .setItems(types, new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialogInterface, int i) {
                                choice = types[i];
                                Toast.makeText(MainActivity4.this,"你的驾照为:"+choice,Toast.LENGTH_SHORT).show();
                            }
                        })
                        .setNegativeButton("取消", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialogInterface, int i) {
                                dialogInterface.dismiss();
                            }
                        });
                dialog.show();

            }
        });
        getBtn_dialog_talk3.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String [] types = {"A照","B照","C照","D照"};

                AlertDialog.Builder dialog = new AlertDialog.Builder(MainActivity4.this)
                        .setTitle("请输入你的驾照类型:")
                        .setSingleChoiceItems(types,2, new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialogInterface, int i) {
                                choice = types[i];
                            }
                        })
                        .setNegativeButton("取消", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialogInterface, int i) {
                                dialogInterface.dismiss();
                            }
                        })
                        .setNegativeButton("确定", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                        Toast.makeText(MainActivity4.this,"你的驾照为:"+choice,Toast.LENGTH_SHORT).show();
                    }
                });
                dialog.show();

            }
        });
        getBtn_dialog_talk4.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String [] types = {"A照","B照","C照","D照"};
                boolean[] checkItems = {true,false,false,true};
                AlertDialog.Builder dialog = new AlertDialog.Builder(MainActivity4.this)
                        .setTitle("请输入你的驾照类型:")
                        .setMultiChoiceItems(types, checkItems, new DialogInterface.OnMultiChoiceClickListener() {
                            @Override
                            public void onClick(DialogInterface dialogInterface, int i, boolean b) {
                                checkItems[i] = b;
                            }
                        })
                        .setNegativeButton("取消", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialogInterface, int i) {
                                dialogInterface.dismiss();
                            }
                        })
                        .setNegativeButton("确定", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialogInterface, int i) {
                                choice = "";
                                for (int j = 0; j <checkItems.length ; j++) {
                                    if (checkItems[j]) {
                                        choice = choice+types[j]+",";
                                    }
                                }
                                Toast.makeText(MainActivity4.this,"你的驾照为:"+choice,Toast.LENGTH_SHORT).show();
                            }
                        });
                dialog.show();
            }
        });
        getBtn_dialog_talk5.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                View v = getLayoutInflater().inflate(R.layout.dialog_login,null);

                AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity4.this)
                        .setTitle("登录")
                        .setView(v)
                        .setNegativeButton("取消", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialogInterface, int i) {
                                dialogInterface.dismiss();
                            }
                        })
                        .setPositiveButton("确定", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialogInterface, int i) {
                                //取出用户输入的账号和密码
                                EditText et_user = v.findViewById(R.id.et_user);
                                String user = et_user.getText().toString();
                                EditText et_pwd = v.findViewById(R.id.et_pwd);
                                String pwd = et_pwd.getText().toString();
                                Toast.makeText(MainActivity4.this,"你的账号是:"+user+",你的密码是:"+pwd,Toast.LENGTH_SHORT).show();
                            }
                        });
                builder.show();
            }
        });

    }
}

4.3对话框的分类

1.普通对话框

btn_dialog_talk.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                AlertDialog.Builder dialog = new AlertDialog.Builder(MainActivity4.this)
                        .setTitle("警告")
                        .setMessage("确定删除该条数据吗?")
                        .setNegativeButton("取消", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialogInterface, int i) {
                                Toast.makeText(MainActivity4.this, "取消", Toast.LENGTH_SHORT).show();
                            }
                        })
                        .setPositiveButton("确定", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialogInterface, int i) {
                                Toast.makeText(MainActivity4.this, "取消", Toast.LENGTH_SHORT).show();
                            }
                        });
                dialog.show();
            }
        });

2.单选对话框

getBtn_dialog_talk2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String [] types = {"A照","B照","C照","D照"};

                AlertDialog.Builder dialog = new AlertDialog.Builder(MainActivity4.this)
                        .setTitle("请输入你的驾照类型:")
                        .setItems(types, new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialogInterface, int i) {
                                choice = types[i];
                                Toast.makeText(MainActivity4.this,"你的驾照为:"+choice,Toast.LENGTH_SHORT).show();
                            }
                        })
                        .setNegativeButton("取消", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialogInterface, int i) {
                                dialogInterface.dismiss();
                            }
                        });
                dialog.show();

            }
        });

3.复选对话框

getBtn_dialog_talk4.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String [] types = {"A照","B照","C照","D照"};
                boolean[] checkItems = {true,false,false,true};
                AlertDialog.Builder dialog = new AlertDialog.Builder(MainActivity4.this)
                        .setTitle("请输入你的驾照类型:")
                        .setMultiChoiceItems(types, checkItems, new DialogInterface.OnMultiChoiceClickListener() {
                            @Override
                            public void onClick(DialogInterface dialogInterface, int i, boolean b) {
                                checkItems[i] = b;
                            }
                        })
                        .setNegativeButton("取消", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialogInterface, int i) {
                                dialogInterface.dismiss();
                            }
                        })
                        .setNegativeButton("确定", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialogInterface, int i) {
                                choice = "";
                                for (int j = 0; j <checkItems.length ; j++) {
                                    if (checkItems[j]) {
                                        choice = choice+types[j]+",";
                                    }
                                }
                                Toast.makeText(MainActivity4.this,"你的驾照为:"+choice,Toast.LENGTH_SHORT).show();
                            }
                        });
                dialog.show();
            }
        });

4.自定义对话框

getBtn_dialog_talk5.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                View v = getLayoutInflater().inflate(R.layout.dialog_login,null);

                AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity4.this)
                        .setTitle("登录")
                        .setView(v)
                        .setNegativeButton("取消", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialogInterface, int i) {
                                dialogInterface.dismiss();
                            }
                        })
                        .setPositiveButton("确定", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialogInterface, int i) {
                                //取出用户输入的账号和密码
                                EditText et_user = v.findViewById(R.id.et_user);
                                String user = et_user.getText().toString();
                                EditText et_pwd = v.findViewById(R.id.et_pwd);
                                String pwd = et_pwd.getText().toString();
                                Toast.makeText(MainActivity4.this,"你的账号是:"+user+",你的密码是:"+pwd,Toast.LENGTH_SHORT).show();
                            }
                        });
                builder.show();
            }
        });

5.下拉列表框

5.1静态赋值

读取Strings.xml中的数据,将数据加载到spinner

1. 在values/strings.xml 中定义一个 String-array
        1. 只需要在Spinner中添加属性  entries,在该属性中调用string-array

<resources>
    <string name="app_name">My Application</string>
    <string name="depart_promt">静态赋值的下拉值</string>
    <string-array name="depart_arr">
        <item>总经办</item>
        <item>人事部</item>
        <item>研发部</item>
        <item>销售部</item>
        <item>管理部</item>
    </string-array>
</resources>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="10dp"
    tools:context=".MainActivity5">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <Spinner
            android:id="@+id/spinner01"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:entries="@array/depart_arr"
            android:layout_weight="2" />

        <Button
            android:id="@+id/button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="确定" />
    </LinearLayout>

    <Spinner
        android:id="@+id/spinner2"
        android:layout_marginTop="50dp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />


</LinearLayout>

Java代码实现

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main5);
        
        button = findViewById(R.id.button);
        spinner2 = findViewById(R.id.spinner2);
        spinner1 = findViewById(R.id.spinner01);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String choice = spinner1.getSelectedItem().toString();
                Toast.makeText(MainActivity5.this, "你的选择是:"+choice, Toast.LENGTH_SHORT).show();
            }
        });

5.2动态赋值

String[] areas = {"金水区","管城区","惠济区","高新区","中原区"};
        //创建适配器
        ArrayAdapter adapter = new ArrayAdapter(MainActivity5.this, android.R.layout.simple_spinner_item,areas);
        //给下拉框设置适配器
        spinner2.setAdapter(adapter);
        spinner2.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
                String choice = areas[i];
                Toast.makeText(MainActivity5.this,"你的选择是:"+choice,Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onNothingSelected(AdapterView<?> adapterView) {

            }
        });

5.3如何使用

跟按钮结合的使用

点击事件是放在button上的

独立使用的

点击事件只能放在Spinner

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值