Android编程_常用组件

常用组件

菜单Menu

目的增加更多功能,不占用主屏空间
Android 3.0 前后的Menu 是不一样的
3.0 以前菜单按钮后底部出现6个菜单项,超出部分以更多显示
3.0 以后的Menu 在屏幕顶部的操作栏,顶部右侧溢出菜单,可以快捷访问目标操作
菜单分类

  1. 选项菜单 OptionMenu
  2. 上下文菜单 ContextMenu
  3. 弹出菜单 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
  1. 设置布局
  2. 设置样式
  3. 自定义Dialog
  4. 显示
    自定义类并绑定
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 弹出式窗口
  1. 创建PopupWindow 对象实例
  2. 设置背景,注册事件监听器和添加动画
  3. 显示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();
            }
        });
    }

动画避免突兀

  1. 创建动画资源 anim
  2. 创建style
  3. 对弹窗风格设置为style
window.setAnimationStyle(style);
数组适配器ArrayAdapter

数据自动适用格式

Fragment

界面功能开发工具

基本应用和概念
设计思想

手机与平板电脑兼容保证页面的可拆分性
Activity 中包含Fragment 解决不同分辨率终端适配模式

与Activity对比

都可以做界面
Fragment 运行时基于Activity 的一个Activity可以运行多个Fragment
Fragment 不能脱离Activity存在
Activity 是屏幕主体,Fragment 是组成元素

生命周期

长与Activity 需要有绑定到Activity的过程
注意onCreateView 生命周期返回视图

Fragment
从创建到运行时回调的生命周期方法有:

  1. onAttach():当Fragment依附到Activity时调用的方法
  2. onCreate()当Fragment创建时调用的方法
  3. onCreateView():给Fragment加载布局时调用的方法
  4. onActivityCreated():当该Fragment依附的Activity创建时调用的方法
  5. onStart():当Fragment启动时调用的方法
  6. onResume():当Fragment正在运行时调用的方法
  7. onPause();当Fragment不在交互时调用该方法
  8. onStop();当Fragment不再可见时调用该方法
  9. onDestroyView():销毁Fragment布局时调用的方法
  10. onDestroy();当Frament销毁时调用的方法
  11. onDetach();当Fragment完全脱离Fragment时调用的方法
怎么使用,静态动态加载
静态加载xml

写好Fragment类 类中加入view
xml 指向Fragment类

ViewPager

应用
  1. 使用场景,引导界面相册多图片
  2. 多Tab页面、App导航
  3. 广告展示播放
support 包

support 版本之外的依赖包 有v4 v7 v8 v13 v17

  1. android.support.v4.view.View.ViewPager
    android support library

androidx.viewpager.widget.ViewPager 新版使用这个
新版的安卓默认使用androidx的包

相关概念
  1. List || List
  2. 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>
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老黑675

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值