一:view
Android中每个控件父类都是一个view,view代表屏幕上的一块空白区域,具体显示什么内容交个具体的控件显示,
比如这块区域处理文本内容的view就用控件TextView
二:控件通用属性
三:基础控件
处理文本的view——TextView
相当于java中Swing包中的JLabel,但是功能更加强大,支持文本处理、支持html代码、文本样式处理、链接效果等,除了上面的通用的属性外,还有以下属性
android:text="@string/app_name"//内容
android:textColor="#fff"//文本颜色
android:textSize="30sp"//文本大小
android:lineSpacingMultiplier="2"//行倍距
android:lineSpacingExtra="20sp"//行距
android:singleLine="true"//单行显示
android:ellipsize="end"//三点省略位置
android:focusable="true"//设置焦点
android:focusableInTouchMode="true"//设置触摸时可获取焦点
android:marqueeRepeatLimit="marquee_forever"//设置跑马灯
被点击的view——Button
对于按钮主要是如何注册点击事件,方法有以下四种
第一种:自定义内部类
<Button
android:id="@+id/login_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="登录"/>
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
//获取按钮
Button login_btn =findViewById(R.id.login_btn);
//按钮login_btn被点击时候的事件,使用自定义内部类实现
login_btnListener login_btnListener = new login_btnListener();
login_btn.setOnClickListener(login_btnListener) ;//注册事件监听器
}
//自定义一个内部类实现点击事件接口
class login_btnListener implements View.OnClickListener{
@Override
public void onClick(View v) {
Log.e("tag","点击了login_btn按钮戳发了自定义事件");
}
}
}
第二种: 匿名内部类
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
Button login_btn =findViewById(R.id.login_btn);
login_btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.e("tag","点击了login_btn按钮戳发了自定义事件");
}
});
}
}
第三种:当前Activity去实现事件接口
public class MainActivity extends AppCompatActivity implements View.OnClickListener{//实现了点击事件接口
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
Button login_btn =findViewById(R.id.login_btn);
login_btn.setOnClickListener(this);
}
@Override
public void onClick(View v) {
Log.e("tag","点击了login_btn按钮戳发了自定义事件");
}
}
第四种: 在布局文件中添加点击事件属性
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="loginClik"
android:text="登录"/>
public class MainActivity extends AppCompatActivity{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
}
public void loginClik(View v) {//定义xml中绑定的方法
Log.e("tag","点击了login_btn按钮戳发了自定义事件");
}
}
处理图片的view——ImageView
用来现实和控制图像的控件,可以对他进行放大缩小旋转等,常见属性:
android:src="@mipmap/login"//指定前景资源名称
接收用户信息输入的View——EditText
用于输入文本内容的输入框,常用属性
android:inputType="textPassword"//文本框类型如number、text...
android:hint="请输入密码"//文本框默认内容
android:maxLength="12"//设置文本长度
进度条类的view——ProgressBar
默认的进度条是一个没有刻度、圆形、只是一个不断旋转的动画效果,通过设置style可以显示水平带有刻度的进度条
style="?android:attr/progressBarStyleHorizontal"//设置滚动条样式,这里progressBarStyleHorizontal是水平
android:progress="30"//设置进度值
android:max="200"//设置进度条最大值 默认100
android:indeterminate="true"//设置一直滚动
如何实现滚动条加载,这个相对于xml而言,在java代码中实现比较容易
我们定义带有id的一个滚动条
<ProgressBar
android:id="@+id/myProgress"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
style="?android:attr/progressBarStyleHorizontal"
/>
public class MainActivity extends AppCompatActivity{//实现了点击事件接口
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
final ProgressBar progressBar = findViewById(R.id.myProgress);
//Android4.o之后不能在线程中直接操作控件 但是进度条是个特列
new Thread(){
@Override
public void run(){
for (int i = 0; i < 100; i++) {
progressBar.setProgress(i);
try {
Thread.sleep(30);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}.start();
}
}
Checkbox复选控件
1个常用属性:默认是否选中
android:checked="true"
3个常用方法:设置选中方法、是否选中方法、选中状态监听方法
<CheckBox
android:id="@+id/checkbox"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="篮球"
android:checked="true" />
public class IndexActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
CheckBox checkBox = findViewById(R.id.checkbox);
checkBox.setChecked(false);//设置选中方法
final boolean flag=checkBox.isChecked();//是否选中方法
Log.d("TAG","选中没有"+flag);
//选中状态监听方法
checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
//业务处理代码
Log.d("Tag","选中状态"+isChecked);
}
});
}
}
与checkbox相比
通过点击无法变为未选中、一组RadioButton同时只能选中一个、大部分ui框架中都以圆形表示
需要放在RadioGroup中使用
<RadioGroup
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<RadioButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="男"/>
<RadioButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="女"/>
</RadioGroup>
ToggleButton开关
常用属性:
android:textOff="关"
android:textOn="开"
android:checked="true"//状态
<ToggleButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textOff="关"
android:textOn="开"
android:checked="true"/>
常用方法:基本使用和上面的一样
setChecked(boolean)
setOnCheckedChangeListener()
常用属性
android:max="100" //拖动条长度
android:progress="30"//拖动条起始位置
案例代码:
<SeekBar
android:id="@+id/seekbar"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:max="100"
android:progress="30" />
常用方法:
seekBar.setProgress(50);//设置进度
seekBar.getProgress(); //获取进度
seekBar.setOnSeekBarChangeListener()//拖动条监听
案例代码:
public class IndexActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
SeekBar seekBar =findViewById(R.id.seekbar);
seekBar.setProgress(50);
seekBar.getProgress();
seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
//实时获取位置
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
Log.d("目前","位置"+seekBar.getProgress());
}
//拉动开始位置
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
Log.d("start","位置"+seekBar.getProgress());
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
Log.d("end","位置"+seekBar.getProgress());
}
});
}
}
四:三种menu
选项菜单OptionMenu
Android3.0之后,选项菜单出现在顶部的操作栏中,如下图有两种方式。直接将选项放在操作栏中或者将选项放置在三个点里,点击某个按钮出现的菜单选项
项目res目录右键new,选择Android Resource Directory,创建一个menu类型的资源文件夹
案例代码:(当然我们也可以在AS中通过拖拽完成)
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:title="保存"
app:showAsAction="always" />
<item
android:title="新建"/>
<item android:title="更多">
<menu >
<item android:title="分享" />
<item android:title="收藏" />
</menu>
</item>
</menu>
几个重要的属性
//直接显示在操作栏中,而不是三点里面
app:showAsAction="always"
//同时设置图标和显示方式,只会显示在操作栏中
android:icon="@mipmap/bg"
app:showAsAction="always"
//既要显示图标又要显示字体如下
android:icon="@mipmap/bg"
app:showAsAction="always|withText"
显示在Activity中
上面我们定义好了菜单,如何放置到界面中?java代码如下
public class IndexActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
//创建OptionMenu
@Override
public boolean onCreateOptionsMenu(Menu menu){
//加载菜单资源
getMenuInflater().inflate(R.menu.demomenu,menu);
return true;
}
//菜单选中的逻辑处理的方法
@Override
public boolean onOptionsItemSelected(MenuItem item){
switch (item.getItemId()){
case R.id.save:
Toast.makeText(this,"保存成功",Toast.LENGTH_SHORT).show();
break;
case R.id.share:
Toast.makeText(this,"分享成功",Toast.LENGTH_SHORT).show();
break;
}
return super.onOptionsItemSelected(item);
}
}
上下文菜单ContextMenu
通过长按界面中的某个view不放,屏幕中间弹出ContextMenu,效果如下。但是ContextMenu所属者是某个按钮控件,OptionMenu是Activity
页面代码demomenu.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:title="保存"
android:id="@+id/save"
/>
<item
android:id="@+id/create"
android:title="新建"/>
</menu>
java代码
public class IndexActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//给按钮注册选项
registerForContextMenu(findViewById(R.id.btn));
}
//创建ContextMenu
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
getMenuInflater().inflate(R.menu.demomenu,menu);
}
//菜单选项方法
@Override
public boolean onContextItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()){
case R.id.save:
Toast.makeText(this,"保存",Toast.LENGTH_SHORT).show();
break;
case R.id.create:
Toast.makeText(this,"创建成功",Toast.LENGTH_SHORT).show();
break;
}
return super.onContextItemSelected(item);
}
}
如何实现长按按钮,菜单选项出现在顶部菜单栏中,也就是开发中常说的上下文模式
页面代码demomenu.xml一样
java代码如下
public class IndexActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//为按钮设置上下文操作模式
//第一步实现ActionMode CallBack
//第二步view的长按事件去启动上下文操作模式
findViewById(R.id.btn).setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
startActionMode(callback);
return false;
}
});
}
ActionMode.Callback callback = new ActionMode.Callback() {
//创建方法,启动上下文操作模式之后调用
@Override
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
getMenuInflater().inflate(R.menu.demomenu,menu);
return true;
}
//创建方法之后调用
@Override
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
return false;
}
//菜单选项点击之后执行
@Override
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
switch (item.getItemId()){
case R.id.save:
Toast.makeText(IndexActivity.this,"保存",Toast.LENGTH_SHORT).show();
break;
case R.id.create:
Toast.makeText(IndexActivity.this,"创建成功",Toast.LENGTH_SHORT).show();
break;
}
return true;
}
//上下文结束时候调用
@Override
public void onDestroyActionMode(ActionMode mode) {
}
};
}
弹出菜单PopupMenu
点击某个控件,菜单选项出现在指定菜单的下方
xml代码一样
java代码如下
public class IndexActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//弹出菜单
final Button button = findViewById(R.id.btn);
findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//实例化一个弹出菜单,第一个参数环境上下文,第二个参数依附于哪个控件下方
PopupMenu menu = new PopupMenu(IndexActivity.this,button);
//加载菜单资源,
menu.getMenuInflater().inflate(R.menu.demomenu,menu.getMenu());
//设置点击监听器
menu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()){
case R.id.save:
Toast.makeText(IndexActivity.this,"保存",Toast.LENGTH_SHORT).show();
break;
case R.id.create:
Toast.makeText(IndexActivity.this,"创建成功",Toast.LENGTH_SHORT).show();
break;
}
return true;
}
});
//显示
menu.show();
}
});
}
}
五:三种对话框(弹窗)
AlertDialog
用于给用户传递信息、提示信息、或者警告用户操作
主要的方法setTitle、 setMessage、create、show
public class IndexActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
//按钮的点击方法
public void myClick(View view){
//AlertDialog的构造器方法是protected,所以不能直接使用,我们通过builder创建
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("提示");
builder.setMessage("确定退出?");
builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int i) {
finish();
}
});
builder.setNegativeButton("取消",null);
builder.show();//显示窗口
}
}
自定义Dialog
自定义弹窗的样式以及布局,同时具有弹窗所有的功能
界面activity_mydialog.xml文件如下
<?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:background="@mipmap/mydialog"
android:gravity="center_horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="你确定要退出吗?"
android:textColor="#000"
android:textStyle="bold"
android:textSize="25sp"
android:layout_marginTop="240dp"/>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_marginTop="55dp">
<Button
android:id="@+id/yes"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="确 定"
android:textStyle="bold"
android:background="#83c122"
android:textSize="16dp"
android:layout_margin="10dp"/>
<Button
android:id="@+id/cancel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="退 出"
android:textStyle="bold"
android:background="#83c122"
android:textSize="16dp"
android:layout_margin="10dp"/>
</LinearLayout>
</LinearLayout>
对于界面的布局文件,在styles.xml定义如下
<!--自定义弹窗样式 -->
<style name="mydialog" parent="android:style/Theme.Dialog">
<item name="android:windowNoTitle">true</item><!--弹窗没有标题-->
<item name="android:windowBackground">@android:color/transparent</item><!--弹窗背景透明-->
</style>
java类如下
//自定义类继承Dialog
public class MydialogActivity extends Dialog {
public MydialogActivity(@NonNull Context context, int themeResId) {
super(context, themeResId);
//设置布局为对话框
super.setContentView(R.layout.activity_mydialog);
findViewById(R.id.yes).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
System.exit(0);
}
});
findViewById(R.id.cancel).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dismiss();
}
});
}
}
主类中引用
public class IndexActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void myClick(View view){
MydialogActivity md = new MydialogActivity(this,R.style.mydialog);
md.show();
}
}
当我们点击了btn之后的效果如下
PopupWindow
如下图中间出现的全选 粘贴 就是PopupWindow,
activity_popupwindow.xml如下
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal" android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:id="@+id/cut"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="剪切"/>
<Button
android:id="@+id/copy"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="复制"/>
</LinearLayout>
java代码
public class IndexActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void myClick(View view){
//弹窗的view对象
View v = LayoutInflater.from(this).inflate(R.layout.activity_popupwindow,null);
//创建实例 参数1用在弹窗中的view参数2弹窗宽高参数3是否获取焦点
final PopupWindow popupWindow = new PopupWindow(v,280,80,true);
//设置背景(可选操作)
popupWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));//背景透明
//设置能响应外部点击事件
popupWindow.setOutsideTouchable(true);
//设置响应点击事件
popupWindow.setTouchable(true);
//显示参数1锚,让弹窗在锚点下方显示,参数2 3相对于锚在x y方向的偏移量
popupWindow.showAsDropDown(view,100,50);
v.findViewById(R.id.cut).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(IndexActivity.this,"剪切成功",Toast.LENGTH_SHORT).show();
popupWindow.dismiss();
}
});
v.findViewById(R.id.copy).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(IndexActivity.this,"复制成功",Toast.LENGTH_SHORT).show();
popupWindow.dismiss();
}
});
}
}
附加功能----增加动画,需要附加的代码如下
mytranslate_anim在styles中定义如下
<!--动画样式-->
<style name="mytranslate_anim">
<item name="android:windowEnterAnimation">@anim/mytranslate</item>
</style>
其中>@anim/mytranslate是定义好的动画资源,方法如下右键res目录,Android resources directory
创建一个anim文件夹
在当前这个anim目录中定义动画资源mytranslate.xml代码如下
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<!--translate移动动画 alpha透明动画 rotate旋转动画 scale缩放动画-->
<translate
android:fromXDelta="0"
android:toXDelta="0"
android:fromYDelta="300"
android:toYDelta="0"
android:duration="2"/><!--持续时间-->
</set>
附加内容:数组适配器
java内容
public class IndexActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void myClick(View view){
final String[] items ={"java","c","c++"};
ArrayAdapter adapter = new ArrayAdapter(this,android.R.layout.simple_dropdown_item_1line,items);
AlertDialog.Builder builder = new AlertDialog.Builder(this)
.setTitle("请选择")
//参数1适配器对象,也就是弹窗中数据显示样式的规则器,这里使用数组适配器
//参数2监听器
.setAdapter(adapter, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int i) {
Toast.makeText(IndexActivity.this,items[i],Toast.LENGTH_SHORT).show();
dialog.dismiss();
}
});
builder.show();
}
}
实现带有自定义样式的是数组适配器
自定array_item_layout.xml如下
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal" android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@mipmap/star"/>
<TextView
android:id="@+id/item_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
java代码如下
之前的
ArrayAdapter adapter = new ArrayAdapter(this,android.R.layout.simple_dropdown_item_1line,items);
替换为下面代码即可,指定自定义的界面R.layout.array_item_layout,把数组加入到指定的位置R.id.item_text
ArrayAdapter adapter = new ArrayAdapter(this,R.layout.array_item_layout,R.id.item_text,items);
文章首发地址:www.javayihao.top
文章首发公众号:java一号