常用组件
菜单Menu
目的增加更多功能,不占用主屏空间
Android 3.0 前后的Menu 是不一样的
3.0 以前菜单按钮
后底部出现6个菜单项,超出部分以更多显示
3.0 以后的Menu 在屏幕顶部的操作栏,顶部右侧溢出菜单,可以快捷访问目标操作
菜单分类
- 选项菜单 OptionMenu
- 上下文菜单 ContextMenu
- 弹出菜单 PopupMenu
menu 显示问题
onCreateOptionsMenus() 方法返回true
onOptionsItemSelecred() 方法返回true
调用父类的默认实现
选项菜单OptionMenu
是一个应用的主菜单项,用于放置对应用产生全局影响的操作,3.0以后不推荐使用
res 文件下的资源
res/menu
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:title="保存"/>
<item android:title="设置"/>
<item android:title="更多操作" >
<menu >
<item android:title="子菜单1" />
<item android:title="子菜单2" />
<item android:title="子菜单3" />
</menu>
</item>
</menu>
与onCreate 并列的创建菜单的方法
@Override
public boolean onCreateOptionsMenu(Menu menu) {
//return super.onCreateOptionsMenu(menu);
// 加载菜单资源
getMenuInflater().inflate(R.menu.option,menu);
return true;
}
菜单的一些重要属性
app:showAsAction="always" 直接显示的选项栏
always 显示在标题栏
never:显示
withText :图片文本一起显示
ifRoom 有空间就显示
android:id="@+id/save"
关于菜单的操作
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
switch(item.getItemId()){
case R.id.save:
Toast.makeText(this,"保存",Toast.LENGTH_SHORT).show();
break;
case R.id.setting:
Toast.makeText(this,"设置",Toast.LENGTH_SHORT).show();
break;
case R.id.exit:
finish();
Toast.makeText(this,"退出",Toast.LENGTH_SHORT).show();
break;
}
return super.onOptionsItemSelected(item);
}
菜单最多允许有次一级子菜单
上下文菜单 ContextMenu
按住某个view 不放,就会出现在屏幕中间弹出ContextMenu 所有者使view
上下文需要注册绑定view
registerForContextMenu(findViewById(R.id.ctx_btn));
创建显示上下文菜单
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
getMenuInflater().inflate(R.menu.context,menu);
}
上下文操作
@Override
public boolean onContextItemSelected(@NonNull MenuItem item) {
switch(item.getItemId()){
case R.id.delete:
Toast.makeText(this,"删除",Toast.LENGTH_SHORT).show();
break;
case R.id.opera:
Toast.makeText(this,"重命名",Toast.LENGTH_SHORT).show();
break;
}
return true;
}
为按钮设置上下文操作:1. 实现ActionMode CallBack 2. 在view 的长按实际中启动上下文操作模式
// 菜单操作
final ActionMode.Callback cb = new ActionMode.Callback() {
// 创建,在启动上下文操作模式(startActionMode(callback)) 时调用
@Override
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
Log.e("TAG","创建");
getMenuInflater().inflate(R.menu.context,menu);
return false;
}
@Override
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
Log.e("TAG","准备");
return false;
}
@Override
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
Log.e("TAG","点击");
switch(item.getItemId()){
case R.id.delete:
Toast.makeText(MainActivity.this,"删除",Toast.LENGTH_SHORT).show();
break;
case R.id.opera:
Toast.makeText(MainActivity.this,"重命名",Toast.LENGTH_SHORT).show();
break;
}
return false;
}
@Override
public void onDestroyActionMode(ActionMode mode) {
Log.e("TAG","结束");
}
};
findViewById(R.id.ctx_btn).setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
startActionMode(cb);
return false;
}
});
将操作转移到上下文操作栏
弹出菜单 PopupMenu
一个模态形式展示弹出风格的菜单,绑定在某个View上,一般出现在绑定的View的下方
final Button popupbtu = findViewById(R.id.popup_btn);
popupbtu.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
//实例化PopupMenu对象(参数2是被锚定的view)
PopupMenu menu = new PopupMenu(MainActivity.this,popupbtu);
// 加载菜单资源
menu.getMenuInflater().inflate(R.menu.popup,menu.getMenu());
// 设置点击监听器
menu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener(){
@Override
public boolean onMenuItemClick(MenuItem item) {
switch(item.getItemId()){
case R.id.copy:
Toast.makeText(MainActivity.this,"复制", LENGTH_SHORT).show();
break;
case R.id.paste:
Toast.makeText(MainActivity.this,"黏贴", LENGTH_SHORT).show();
break;
default:
super.onOptionsItemSelected(item);
}
return false;
}
});
// 注意
menu.show();
}
});
对话框
AlertDialog 提示对话框
消息提示机制,常用于向用户传递信息,提示或警告用户的行为,通用方法:setTitle、setMessage、create 、show
// AlertDialog 的构造方法是protected
// 1. 实例化一个构建器
AlertDialog.Builder builder = new AlertDialog.Builder(this);
// 2. 设置对话框样式
builder.setTitle("提示");
builder.setMessage("你确定退出程序吗");
builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
finish();
}
});
builder.setNegativeButton("取消",null);
//3. 展示
builder.show();
// AlertDialog dialog = builder.create();
// dialog.show();
自定义Dialog
- 设置布局
- 设置样式
- 自定义Dialog
- 显示
自定义类并绑定
public class MyDialog extends Dialog {
public MyDialog(@NonNull Context context,int themeResId) {
super(context,themeResId);
setContentView(R.layout.dialog);
}
}
需要定义风格
<style name="mydialog" parent="android:style/Theme.Dialog">
<item name="android:windowNoTitle">true</item>
<item name="android:windowBackground">@android:color/transparent</item>
</style>
使用
MyDialog md = new MyDialog(this,R,style.mydialog);
md.show();
退出程序
finsh()
System.exit(0);
PopupWindow 弹出式窗口
- 创建PopupWindow 对象实例
- 设置背景,注册事件监听器和添加动画
- 显示PopupWindow
public void showPopupWindow(View view){
//1.实例化对象
// 布局-》 控件 准备弹窗需要的视图对象
View v = LayoutInflater.from(this).inflate(R.layout.dialog,null);
//1. 参数1 弹窗中的View 宽高 是否获取焦点
final PopupWindow window = new PopupWindow(v,200,400,true) ;
//2. 设置 背景动画
// 设置背景
window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
// 设置能相应外部的点击事件
window.setOutsideTouchable(true);
// 设置能响应点击事件
window.setTouchable(true);
//3. 显示 参数2,3 相对于锚,x,y 的偏移量
window.showAsDropDown(view);
//为弹窗中的文本创建点击事件
v.findViewById(R.id.pt_btn).setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
// 弹窗消失
window.dismiss();
}
});
}
动画避免突兀
- 创建动画资源 anim
- 创建style
- 对弹窗风格设置为style
window.setAnimationStyle(style);
数组适配器ArrayAdapter
数据自动适用格式
Fragment
界面功能开发工具
基本应用和概念
设计思想
手机与平板电脑兼容保证页面的可拆分性
Activity 中包含Fragment 解决不同分辨率终端适配模式
与Activity对比
都可以做界面
Fragment 运行时基于Activity 的一个Activity可以运行多个Fragment
Fragment 不能脱离Activity存在
Activity 是屏幕主体,Fragment 是组成元素
生命周期
长与Activity 需要有绑定到Activity的过程
注意onCreateView 生命周期返回视图
当
Fragment
从创建到运行时回调的生命周期方法有:
- onAttach():当Fragment依附到Activity时调用的方法
- onCreate()当Fragment创建时调用的方法
- onCreateView():给Fragment加载布局时调用的方法
- onActivityCreated():当该Fragment依附的Activity创建时调用的方法
- onStart():当Fragment启动时调用的方法
- onResume():当Fragment正在运行时调用的方法
- onPause();当Fragment不在交互时调用该方法
- onStop();当Fragment不再可见时调用该方法
- onDestroyView():销毁Fragment布局时调用的方法
- onDestroy();当Frament销毁时调用的方法
- onDetach();当Fragment完全脱离Fragment时调用的方法
怎么使用,静态动态加载
静态加载xml
写好Fragment类 类中加入view
xml 指向Fragment类
ViewPager
应用
- 使用场景,引导界面相册多图片
- 多Tab页面、App导航
- 广告展示播放
support 包
support 版本之外的依赖包 有v4 v7 v8 v13 v17
- android.support.v4.view.View.ViewPager
android support library
androidx.viewpager.widget.ViewPager 新版使用这个
新版的安卓默认使用androidx的包
相关概念
- List || List
- PageAdapter || Fragment{ageAdater
public class ImageViewPagerAdapter extends AppCompatActivity {
private int [] mLayoutIDs = {
R.layout.view_first,
R.layout.view_second,
R.layout.view_thrid
};
private List<View> views;
private ViewPager viewPager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_image_view_adopter);
viewPager = (ViewPager)findViewById(R.id.view_pager);
// 初始化数据
views = new ArrayList<>();
for (int i = 0; i < 3; i++) {
View view = getLayoutInflater().inflate(mLayoutIDs[i], null);
views.add(view);
}
// 设置adapter适配器
viewPager.setAdapter(mPagerAdapter);
}
PagerAdapter mPagerAdapter = new PagerAdapter() {
@Override
public int getCount() {
// 页数量
return mLayoutIDs.length;
}
@Override
public boolean isViewFromObject(@NonNull View view, @NonNull Object object) {
return view == object;
}
@NonNull
@Override
public Object instantiateItem(@NonNull ViewGroup container, int position) {
// 视图加入
View child = views.get(position);
container.addView(child);
return child;
}
@Override
public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
container.removeView(views.get(position));
}
};
}
<androidx.viewpager.widget.ViewPager 新版android 默认
android:id="@+id/view_pager"
android:layout_width="match_parent"
android:layout_height="match_parent">
</androidx.viewpager.widget.ViewPager>