1. 逻辑代码

1.1 MainActivity 类


package com.example.myapplication;import android.Manifest;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Bundle;import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.navigation.NavController;
import androidx.navigation.Navigation;import android.os.Parcelable;
import android.provider.MediaStore;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;/*** A simple {@link Fragment} subclass.* Use the {@link BlankFragment4#newInstance} factory method to* create an instance of this fragment.*/
public class BlankFragment4 extends Fragment {// TODO: Rename parameter arguments, choose names that match// the fragment initialization parameters, e.g. ARG_ITEM_NUMBERprivate static final String ARG_PARAM1 = "param1";private static final String ARG_PARAM2 = "param2";// TODO: Rename and change types of parametersprivate String mParam1;private String mParam2;private ImageView imageView;// 定义全局的 imageViewprivate TextView textView; // 昵称public BlankFragment4() {// Required empty public constructor}/*** Use this factory method to create a new instance of* this fragment using the provided parameters.** @param param1 Parameter 1.* @param param2 Parameter 2.* @return A new instance of fragment BlankFragment2.*/// TODO: Rename and change types and number of parameterspublic static BlankFragment4 newInstance(String param1, String param2) {BlankFragment4 fragment = new BlankFragment4();Bundle args = new Bundle();args.putString(ARG_PARAM1, param1);args.putString(ARG_PARAM2, param2);fragment.setArguments(args);return fragment;}@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);if (getArguments() != null) {mParam1 = getArguments().getString(ARG_PARAM1);mParam2 = getArguments().getString(ARG_PARAM2);}}@Overridepublic View onCreateView(final LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {// Inflate the layout for this fragment// 普遍用viewView view = inflater.inflate(R.layout.fragment_blank4, container, false);// 普遍用view// TODO 头像组件ImageView img = view.findViewById(R.id.imageView);img.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Log.i("tag","点击换头像");// 弹出菜单框 选择从相机拍照 还是 选择图库// context : 传入activity对象// 使用方法 1.this在activity中 2.activity.this同1 3.在Fragment中使用getActivity()AlertDialog.Builder dialog = new AlertDialog.Builder(getActivity());dialog.setItems(new String[]{"拍照", "相册"},new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {// 点击后,具体处理,Log.i("tag","which " + which);Log.i("tag","dialog " + dialog);// 判断 which 从而判断用户点击的是第几个if (which == 0) {// 调用系统相机权限 弹出是否同意授权requestPermissions(new String[]{Manifest.permission.CAMERA,Manifest.permission.WRITE_EXTERNAL_STORAGE},10);// 动态申请权限} else if (which == 1) {// 调用系统相机 直接打开Intent intent = new Intent();// ACTION_GET_CONTENT = "android.intent.action.GET_CONTENT"intent.setAction(Intent.ACTION_PICK); // 设置跳转到相册intent.setType("image/*"); // 设置类型 选图片startActivityForResult(intent,3);}}});dialog.show();}});// TODO 昵称行组件// 获取昵称textView = view.findViewById(R.id.save_nick_name);LinearLayout linearLayout = view.findViewById(R.id.nick_name);linearLayout.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Log.i("tag","点击换昵称"); // 调试Intent intent = new Intent(getActivity(), ChangeNickname.class);// 跳转后,当返回时能返回数据startActivityForResult(intent, 2);}});// 全局的 imageView 从 fragment_blank4 实例 view 获取imageView = view.findViewById(R.id.imageView);return view;}// 动态权限回调 requestCode:10 上面的requestCode@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {super.onRequestPermissionsResult(requestCode, permissions, grantResults);// TODO 相机activityif (requestCode == 10) { // 系统相机申请权限返回10// 判断用户是否同意, PERMISSION_GRANTED = 0 : =>同意if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {// 调用相机activityIntent intent = new Intent();intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE); // 参数="android.media.action.IMAGE_CAPTURE"startActivityForResult(intent,1); // 相机获取的数据的返回值}}}@Overridepublic void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {super.onActivityResult(requestCode, resultCode, data);if (requestCode == 1) {// 相机activity返回// 获取相机返回的图片 bitmapassert data != null;Bundle bundle = data.getExtras();assert bundle != null; // 调试宏,只在debug模式下有效。如果不满足条件,就会出现断言Bitmap bitmap = bundle.getParcelable("data");//imageView.setImageBitmap(bitmap);} else if (requestCode == 3) {// 获取相册返回的图片 uri对象// 例子:uri = content://com.google.android.apps.photos.contentprovider/-1/1/content%3A%2F%2Fmedia%2Fexternal%2Fimages%2Fmedia%2F22/ORIGINAL/NONE/609859626Uri uri = data.getData();imageView.setImageURI(uri);}}
}

2. 布局代码

2.1 XML 文件

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout 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"tools:context=".BlankFragment2"><!-- TODO: Update blank fragment layout --><LinearLayoutandroid:layout_width="match_parent"android:layout_height="600dp"android:orientation="vertical"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="110dp"android:orientation="horizontal"><TextViewandroid:layout_width="0dp"android:layout_weight="1"android:layout_height="match_parent"android:textSize="20dp"android:text="头像"android:gravity="left|center"android:scaleType="fitXY"android:padding="20dp"/><ImageViewandroid:id="@+id/imageView"android:layout_width="80dp"android:layout_height="80dp"android:layout_gravity="center"android:layout_margin="20dp"android:src="@drawable/avatar" /></LinearLayout><LinearLayoutandroid:id="@+id/nick_name"android:layout_width="match_parent"android:layout_height="110dp"android:orientation="horizontal"><TextViewandroid:layout_width="0dp"android:layout_weight="1"android:layout_height="match_parent"android:textSize="20dp"android:text="昵称"android:gravity="left|center"android:padding="20dp"tools:ignore="RtlHardcoded" /><TextViewandroid:id="@+id/save_nick_name"android:layout_width="0dp"android:layout_weight="1"android:layout_height="match_parent"android:textSize="15dp"android:text="小明"android:gravity="right|center"android:padding="20dp"/></LinearLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_height="110dp"android:orientation="horizontal"><TextViewandroid:layout_width="0dp"android:layout_weight="1"android:layout_height="match_parent"android:textSize="20dp"android:text="微信号"android:gravity="left|center"android:padding="20dp"/><TextViewandroid:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"android:gravity="right|center"android:padding="20dp"android:text="xiaoming"android:textSize="15dp" /></LinearLayout></LinearLayout></FrameLayout>

3.配置代码

3.1 build.gradle 文件

apply plugin: 'com.android.application'android {compileSdkVersion 30buildToolsVersion "30.0.2"defaultConfig {applicationId "com.example.myapplication"minSdkVersion 16targetSdkVersion 30versionCode 1versionName "1.0"testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"}buildTypes {release {minifyEnabled falseproguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'}}
}
// 指定当前项目的所有依赖关系:本地依赖、库依赖、远程依赖
dependencies {implementation fileTree(dir: "libs", include: ["*.jar"]) // 本地依赖implementation 'androidx.appcompat:appcompat:1.2.0'implementation 'androidx.constraintlayout:constraintlayout:2.0.1'implementation 'androidx.legacy:legacy-support-v4:1.0.0'implementation 'androidx.navigation:navigation-fragment:2.1.0'implementation 'androidx.navigation:navigation-ui:2.1.0'testImplementation 'junit:junit:4.12' // 测试用例库androidTestImplementation 'androidx.test.ext:junit:1.1.2'androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
}

3.2 AndroidManifest.xml 文件

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.example.myapplication"><applicationandroid:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:networkSecurityConfig="@xml/network_config"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/AppTheme.NoActionBar"><activity android:name=".MainActivity3"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity><activity android:name=".MainActivity2" /><activity android:name=".MainActivity" /></application><!-- 配置相机权限 --><uses-permission android:name="android.permission.CAMERA"/><!-- 配置相机权限 -->
</manifest>

AndroidStudio - - - 点击头像更换头像_菜单选择_相机拍照与相册获取相关推荐

  1. 【项目难点】实现微信小程序中点击头像更换头像

    由于展示个人信息的时候需要放上个人头像,所以为了更好的用户体验要有修改个人头像的功能. 最开始,打算使用uview的upload组件,结果发现总是有右上角的关闭和下方的进度条,非常丑.想到正常的个人信 ...

  2. Android 项目更换头像(拍照和选择相册)

    之前开发项目的时候一直没有做更换头像这一块,因为开发的东西很少有需要用户进行登录的,最近比较闲,记录一下修改头像这一块, 就不说需求了 看图 场景很简单,也符合更换头像的需求 描述:点击头像 ,弹出菜 ...

  3. Android中更换头像功能的实现

    点击头像实现更换头像,可以从相册里进行更换,也可以拍摄照片更换 运行效果图 点击从相册中选择,选择图片 点击从相册中选择 Activity中的代码,因为这是在我的项目中做的所以有些代码是没有必要的,在 ...

  4. iview 组件 设置头像更换

    基于iview 组件 设置头像更换 <!-- 头像更换 --><div style="width: 100%;height:100%;"><div s ...

  5. 【Flutter】Flutter 拍照示例 ( 浮动按钮及点击事件 | 底部显示按钮组件 | 手势检测器组件 | 拍照并获取当前拍摄照片 | 从相册中选择图片 )

    文章目录 一.浮动按钮及点击事件 二.底部显示按钮组件 三.手势检测器组件 四.image_picker 完整代码示例 五.相关资源 一.浮动按钮及点击事件 一般使用 Scaffold 组件作为界面的 ...

  6. pycharm python下载_PyCharm下载|PyCharm(Python开发工具) V2019.2 官方最新版 下载_当下软件园_软件下载...

    PyCharm是一款针对Python语言开发时提高其效率的编程工具,语法简洁清晰,具备调试.语法高亮.Project管理.代码跳转.智能提示.自动完成.单元测试.版本控制等功能,新版本改善了Jupyt ...

  7. marker 头像 高德地图_高德地图头像怎么更换 高德地图更换头像图文教程

    相信绝大部分人都知道微信头像以及QQ头像怎么更换,而设置头像也是很多人喜欢做的一件事情.而对于经常使用高德地图的用户来说,头像该怎么设置呢?对于这群用户,下面百事网小编为大家带来详细的高德地图更换头像 ...

  8. php修改头像怎么做,PHP - 点击更换头像

    原理: 操作流程: 首先点击头像图片,弹出选择窗口,选中其中一个则窗口推出头像更换. 效果: 主页面代码: 头像: 子页面代码(弹出窗体页面): 请选择头像: echo ""; } ...

  9. html 上传头像前预览以及点击头像去选择和更换头像

    一般情况我们在html上传图片时都是通过input[file]选择图片,但是选择后并不能预览.今天碰到这样一个需求,先看图: 需求是: 1.选择图片不是点击input[file],而是点击用户图片 2 ...

最新文章

  1. ubuntu16.04 svn搭建多项目搭建多个版本仓
  2. “staticMetaObject”: 不是“****”的成员
  3. 幂等和高并发在电商系统中的使用
  4. 函数:MySQL中字符串匹配函数LOCATE和POSITION使用方法
  5. C#中split分隔字符串的应用
  6. .net项目开发工具最新动态
  7. PicPick手册:绿色小巧功能多的截屏软件
  8. ztree 后台异步加载_zTree异步加载实现
  9. Centos使用Cacti监控你的网络
  10. Wysistat与Webtrends比较
  11. Pandas 重置索引深度总结
  12. 如何将mp3合并在一起?
  13. 20221222 Coppeliasim的视频导出功能
  14. JS - 解决鼠标单击、双击事件冲突问题(原生js实现)
  15. WEB攻防-通用漏洞SQL读写注入ACCESS偏移注入MYSQLMSSQLPostgreSQL
  16. 商业模式,淘宝,拼多多,京东,短视频商业模式
  17. 一种改进的人工鱼群算法及其应用(Matlab代码实现)
  18. 【最新版】腾X软件管理电脑管家提取免安装绿色版,比官方软件好用很多!
  19. 2022年PMP最新报名流程来了! PMP考生看过来!
  20. FJUT-cwl的女朋友3 凑钱最少张数问题

热门文章

  1. springBoot员工管理系统
  2. 1、HotSpot And OpenJDK And OracleJDK And JER区别
  3. JSD-2204-续Docker命令-布隆过滤器的测试-秒杀业务完善-ELK-配置中心-Day18
  4. 多进程写同一个日志并发问题分析
  5. bzoj1758 [Wc2010]重建计划
  6. led大屏按实际尺寸设计画面_P10户外LED电子大屏幕按16:9计算屏幕实际尺寸
  7. Tarjan算法小结1——SCC
  8. windows点阵字体转linux版,Deepin 20.1下安装和配置点阵字体,可解决低分屏字体模糊问题...
  9. Google 工程师二三事
  10. 程序化广告(5):广告投放