Android.Widget.Toast

本文详细介绍了安卓开发中Toast视图的多种使用方法,包括默认显示、自定义位置显示、携带图片显示、完全自定义显示及在其他线程中的调用。

刚开始进入到安卓UI界面设计的时候在一个显示输入信息的点击事件中,应用了Toast这个视图。以下根据查看文档搜集资料将toast讲解一下:

Toast 是一个 View 视图, Toast 在应用程序上浮动显示信息给用户,它永远不会获得焦点,不影响用户的输入等操作,主要用于 一些帮助 / 提示

Toast 最常见的创建方式是使用静态方法 Toast.makeText。

Toast主要有:默认显示、自定义位置显示、携带图片显示、完全自定义显示、其它线程通过Handler调用。

1、默认显示

// 第一个参数:当前的上下文环境。可用getApplicationContext()或this
// 第二个参数:要显示的字符串。也可是R.string中字符串ID
// 第三个参数:显示的时间长短。Toast默认的有两个LENGTH_LONG(长)和LENGTH_SHORT(短),也可以使用毫秒如2000ms
Toast toast=Toast.makeText(getApplicationContext(), "默认的Toast", Toast.LENGTH_SHORT);
//显示toast信息
toast.show();


2、自定义位置显示

Toast toast=Toast.makeText(getApplicationContext(), "自定义显示位置的Toast", Toast.LENGTH_SHORT);
//第一个参数:设置toast在屏幕中显示的位置。我现在的设置是居中靠顶
//第二个参数:相对于第一个参数设置toast位置的横向X轴的偏移量,正数向右偏移,负数向左偏移
//第三个参数:同的第二个参数道理一样
//如果你设置的偏移量超过了屏幕的范围,toast将在屏幕内靠近超出的那个边界显示
toast.setGravity(Gravity.TOP|Gravity.CENTER, -50, 100); 
//屏幕居中显示,X轴和Y轴偏移量都是0
//toast.setGravity(Gravity.CENTER, 0, 0); 
toast.show();

3、到图片的toast显示

Toast toast=Toast.makeText(getApplicationContext(), "显示带图片的toast", 3000);
toast.setGravity(Gravity.CENTER, 0, 0); 
//创建图片视图对象
ImageView imageView= new ImageView(getApplicationContext());
//设置图片
imageView.setImageResource(R.drawable.ic_launcher);
//获得toast的布局
LinearLayout toastView = (LinearLayout) toast.getView();
//设置此布局为横向的
toastView.setOrientation(LinearLayout.HORIZONTAL);
//将ImageView在加入到此布局中的第一个位置
toastView.addView(imageView, 0);
toast.show();


4、完全自定义显示

//Inflater意思是充气
  //LayoutInflater这个类用来实例化XML文件到其相应的视图对象的布局
  LayoutInflater inflater = getLayoutInflater();
  //通过制定XML文件及布局ID来填充一个视图对象
  View layout = inflater.inflate(R.layout.custom2,(ViewGroup)findViewById(R.id.llToast));
  
  ImageView image = (ImageView) layout.findViewById(R.id.tvImageToast);
  //设置布局中图片视图中图片
  image.setImageResource(R.drawable.ic_launcher);
  
  TextView title = (TextView) layout.findViewById(R.id.tvTitleToast);
  //设置标题
  title.setText("标题栏");
  
  TextView text = (TextView) layout.findViewById(R.id.tvTextToast);
  //设置内容
  text.setText("完全自定义Toast");
  
  Toast toast= new Toast(getApplicationContext());
  toast.setGravity(Gravity.CENTER , 0, 0);
  toast.setDuration(Toast.LENGTH_LONG);
  toast.setView(layout);
  toast.show();


5、其它线程通过Handler的调用

//调用方法1
//Thread th=new Thread(this);
//th.start();
//调用方法2
handler.post(new Runnable() {
@Override
public void run() {
showToast();
}
});


public void showToast(){
Toast toast=Toast.makeText(getApplicationContext(), "Toast在其他线程中调用显示", Toast.LENGTH_SHORT);
toast.show();
}

Handler handler=new Handler(){
@Override
public void handleMessage(Message msg) {
int what=msg.what;
switch (what) {
case 1:
showToast();
break;
default:
break;
}

super.handleMessage(msg);
}
};



@Override
public void run() {
handler.sendEmptyMessage(1);
}

package cn.itcast.animalconnection; import android.content.SharedPreferences; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.CheckBox; import android.widget.EditText; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; public class AdminActivity extends AppCompatActivity { private EditText etUsername, etOldPassword, etNewPassword; private Button btnChangePassword; private SharedPreferences sharedPreferences; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_admin); etUsername = findViewById(R.id.etAdminUsername); etOldPassword = findViewById(R.id.etAdminOldPassword); etNewPassword = findViewById(R.id.etAdminNewPassword); btnChangePassword = findViewById(R.id.btnAdminChangePassword); sharedPreferences = getSharedPreferences("LoginPrefs", MODE_PRIVATE); btnChangePassword.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String username = etUsername.getText().toString(); String oldPassword = etOldPassword.getText().toString(); String newPassword = etNewPassword.getText().toString(); if (username.equals("Admin") || username.equals("user")) { String storedPassword = sharedPreferences.getString(username, ""); if (storedPassword.equals(oldPassword)) { SharedPreferences.Editor editor = sharedPreferences.edit(); editor.putString(username, newPassword); editor.apply(); Toast.makeText(AdminActivity.this, "密码修改成功", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(AdminActivity.this, "旧密码错误", Toast.LENGTH_SHORT).show(); } } else { Toast.makeText(AdminActivity.this, "无效的用户名", Toast.LENGTH_SHORT).show(); } } }); } } 根据以上代码将无效的用户名修改成修改成功,并且新的用户名和密码可以在登录页面重新登录成功
05-22
package com.example.administrator.z1; import android.content.Intent; import android.content.SharedPreferences; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; public class Z3 extends AppCompatActivity { private EditText etNewPasswordAdmin; private EditText etNewPasswordUser; private Button btnChangePasswordAdmin; private Button btnChangePasswordUser; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_z3); etNewPasswordAdmin = findViewById(R.id.et_new_password_admin); etNewPasswordUser = findViewById(R.id.et_new_password_user); btnChangePasswordAdmin = findViewById(R.id.btn_change_password_admin); btnChangePasswordUser = findViewById(R.id.btn_change_password_user); btnChangePasswordAdmin.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String newPasswordAdmin = etNewPasswordAdmin.getText().toString(); if (newPasswordAdmin.isEmpty()) { Toast.makeText(Z3.this, "请输入admin的新密码", Toast.LENGTH_SHORT).show(); return; } SharedPreferences.Editor editor = getSharedPreferences("admin_password", MODE_PRIVATE).edit(); editor.putString("password", newPasswordAdmin); editor.apply(); Toast.makeText(Z3.this, "admin密码已更改", Toast.LENGTH_SHORT).show(); // 返回登录页面 Intent intent = new Intent(Z3.this, Z2.class); startActivity(intent); finish(); } }); btnChangePasswordUser.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String newPasswordUser = etNewPasswordUser.getText().toString(); if (newPasswordUser.isEmpty()) { Toast.makeText(Z3.this, "请输入user的新密码", Toast.LENGTH_SHORT).show(); return; } SharedPreferences.Editor editor = getSharedPreferences("user_password", MODE_PRIVATE).edit(); editor.putString("password", newPasswordUser); editor.apply(); Toast.makeText(Z3.this, "user密码已更改", Toast.LENGTH_SHORT).show(); // 返回登录页面 Intent intent = new Intent(Z3.this, Z2.class); startActivity(intent); finish(); } }); } }package cn.itcast.animalconnection; import android.content.SharedPreferences; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.CheckBox; import android.widget.EditText; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; public class AdminActivity extends AppCompatActivity { private EditText etUsername, etOldPassword, etNewPassword; private Button btnChangePassword; private SharedPreferences sharedPreferences; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_admin); etUsername = findViewById(R.id.etAdminUsername); etOldPassword = findViewById(R.id.etAdminOldPassword); etNewPassword = findViewById(R.id.etAdminNewPassword); btnChangePassword = findViewById(R.id.btnAdminChangePassword); sharedPreferences = getSharedPreferences("LoginPrefs", MODE_PRIVATE); btnChangePassword.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String username = etUsername.getText().toString(); String oldPassword = etOldPassword.getText().toString(); String newPassword = etNewPassword.getText().toString(); if (username.equals("Admin") || username.equals("user")) { String storedPassword = sharedPreferences.getString(username, ""); if (storedPassword.equals(oldPassword)) { SharedPreferences.Editor editor = sharedPreferences.edit(); editor.putString(username, newPassword); editor.apply(); Toast.makeText(AdminActivity.this, "密码修改成功", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(AdminActivity.this, "旧密码错误", Toast.LENGTH_SHORT).show(); } } else { Toast.makeText(AdminActivity.this, "无效的用户名", Toast.LENGTH_SHORT).show(); } } }); 第一个代码中的内容添加到第二个代码里面,但第二个里的代码名等不发生改变,只是适当添加点一个代码中的内容
05-22
// 在你的 BaseApplication.java 或者一个工具类中 import android.content.Context; import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; import android.widget.TextView; import android.widget.Toast; public class ManagedCustomToast { private static Toast currentToast; private static View toastView; // 可以选择复用 View,但需要小心管理 public static void show(Context context, String message) { // 如果当前有 Toast 正在显示,先取消它 if (currentToast != null) { currentToast.cancel(); // cancel() 会尝试移除 View } // 重新创建 View 或者确保 View 没有被添加到 Window Manager if (toastView == null || toastView.getParent() != null) { // 检查 View 是否已经被添加 LayoutInflater inflater = LayoutInflater.from(context); toastView = inflater.inflate(R.layout.custom_toast_layout, null); } TextView text = toastView.findViewById(R.id.toast_text); text.setText(message); currentToast = new Toast(context.getApplicationContext()); currentToast.setGravity(Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM, 0, 100); // 示例位置 currentToast.setDuration(Toast.LENGTH_SHORT); currentToast.setView(toastView); currentToast.show(); } // 可选:提供一个方法来在 Activity/Fragment 销毁时取消 Toast,以防内存泄漏 public static void cancelCurrentToast() { if (currentToast != null) { currentToast.cancel(); currentToast = null; } } } 以上代码怎么优化成能复用toast的 防止连点toast一直弹
最新发布
08-30
<think>我们正在讨论Android开发中的权限管理和组件调用。用户提供的import语句是Android开发中常见的用于处理权限、意图(Intent)和用户界面的类。下面我将逐一解释每个import的作用,并结合用户之前的问题(关于拨号功能的实现)进行说明。 注意:用户提供的引用[1]和[2]中,[1]是关于Android的软件包可见性(Package Visibility)的官方文档,[2]似乎包含了一些代码片段,但不够完整。我们将主要关注用户的问题,即这些import的作用。 1. `import android.Manifest;` 这个类提供了所有Android系统权限的常量定义。例如,我们在拨号功能中需要使用的拨打电话权限`Manifest.permission.CALL_PHONE`。通过这个类,我们可以避免直接使用字符串,减少错误。 2. `import android.content.Intent;` Intent是Android中用于在组件(如Activity、Service等)之间传递消息的对象。它可以用来启动新的Activity、服务或者广播。在拨号功能中,我们使用Intent来启动系统的拨号界面或直接拨打电话。 3. `import android.content.pm.PackageManager;` PackageManager类提供与设备上已安装的应用程序包相关的各种信息。在权限检查中,我们使用这个类中的常量(如`PackageManager.PERMISSION_GRANTED`)来判断应用是否被授予了某个权限。 4. `import android.net.Uri;` Uri(统一资源标识符)用于标识资源,比如在拨号功能中,电话号码被表示为`tel:`URI(例如:`Uri.parse("tel:123456")`)。 5. `import android.os.Bundle;` Bundle用于在Activity之间传递数据,它保存键值对数据。在Activity的生命周期方法(如`onCreate`)中,我们使用Bundle来保存和恢复Activity的状态。 6. `import android.widget.Button;` 这是Android UI中的按钮控件。在拨号功能中,我们通常会有一个按钮,用户点击后触发拨号操作。 7. `import android.widget.Toast;` Toast用于向用户显示简单的提示信息。例如,当用户没有输入电话号码时,我们可以用Toast提示用户输入。 结合之前我们实现的拨号功能,这些import的类在代码中扮演了以下角色: - 在`onCreate`方法中,我们通过`findViewById`获取`Button`实例,并设置点击监听器。 - 当按钮被点击时,我们检查用户是否授权了`CALL_PHONE`权限(使用`Manifest.permission.CALL_PHONE`和`PackageManager`的常量)。 - 如果已授权,我们创建一个`Intent`,设置其动作为`Intent.ACTION_CALL`,并设置数据为电话号码的`Uri`,然后启动这个Intent。 - 如果未授权,我们请求权限,并在`onRequestPermissionsResult`中处理授权结果(这里使用`PackageManager.PERMISSION_GRANTED`判断)。 - 在需要提示用户的地方(如号码为空、权限被拒绝等),使用`Toast`。 此外,关于软件包可见性(引用[1]),在Android 11(API级别30)及更高版本中,应用默认只能看到自动可见的软件包(如自己的应用和某些系统应用)。如果我们的应用需要与设备上其他特定应用交互(例如通过Intent启动其他应用),可能需要声明`<queries>`元素。但拨号功能是启动系统拨号应用,通常属于自动可见的软件包,所以一般不需要额外声明。不过,如果遇到无法启动拨号应用的情况,可能需要检查软件包可见性。 下面是一个简化的代码示例,展示这些import的类如何协同工作: ```java import android.Manifest; import android.content.Intent; import android.content.pm.PackageManager; import android.net.Uri; import android.os.Bundle; import android.widget.Button; import android.widget.Toast; import androidx.appcompat.app.AppCompatActivity; import androidx.core.app.ActivityCompat; import androidx.core.content.ContextCompat; public class MainActivity extends AppCompatActivity { private static final int CALL_PHONE_REQUEST_CODE = 1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button dialButton = findViewById(R.id.dial_button); dialButton.setOnClickListener(v -> { // 检查权限 if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CALL_PHONE) == PackageManager.PERMISSION_GRANTED) { makePhoneCall(); } else { // 请求权限 ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.CALL_PHONE}, CALL_PHONE_REQUEST_CODE); } }); } private void makePhoneCall() { try { Intent intent = new Intent(Intent.ACTION_CALL); intent.setData(Uri.parse("tel:123456")); startActivity(intent); } catch (SecurityException e) { Toast.makeText(this, "权限错误: " + e.getMessage(), Toast.LENGTH_SHORT).show(); } } @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == CALL_PHONE_REQUEST_CODE) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { makePhoneCall(); } else { Toast.makeText(this, "用户拒绝了拨号权限", Toast.LENGTH_SHORT).show(); } } } } ``` 注意:上面的代码使用了Java语言,但之前我们展示的是Kotlin版本,这里为了说明import的作用,使用Java编写。两种语言中这些类的使用方式类似。 总结每个import的作用: - `Manifest`:访问权限常量。 - `Intent`:用于启动组件(如拨号)。 - `PackageManager`:提供权限状态常量。 - `Uri`:表示电话号码的URI。 - `Bundle`:保存Activity状态。 - `Button`:用户界面按钮。 - `Toast`:显示提示信息。 最后,关于引用[2]中提到的`intent.getDataString()`,它用于从Intent中获取数据URI的字符串形式。例如,在接收返回结果的Activity中,我们可以通过该方法获取数据。但在拨号功能中,我们主要是发送Intent,所以没有用到。 相关问题: 1.Android中,除了`CALL_PHONE`权限,还有哪些常见的危险权限(Dangerous Permission)? 2. 如何在不直接拨打电话的情况下,打开系统拨号界面并预填充电话号码? 3.Android 10及以上版本中,权限请求流程有哪些变化? 4. 如何处理用户永久拒绝权限的情况(例如,引导用户去设置中打开权限)?</think>### Android开发中核心导入包的作用详解 在Android开发中,您列出的导入包都是实现权限管理和组件调用的关键组件。以下是每个包的详细作用说明: #### 1. `android.Manifest` - **作用**:提供访问Android权限常量的接口 - **使用场景**: - 声明运行时权限请求(如`Manifest.permission.CALL_PHONE`) - 在代码中引用AndroidManifest.xml中定义的权限 - **示例**: ```java // 请求拨号权限 ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CALL_PHONE}, REQUEST_CODE); ``` #### 2. `android.content.Intent` - **作用**:实现Android组件间的通信和操作调度 - **关键功能**: - 启动Activity:`startActivity(intent)` - 启动Service:`startService(intent)` - 发送广播:`sendBroadcast(intent)` - 拨号功能实现: ```java Intent dialIntent = new Intent(Intent.ACTION_CALL); dialIntent.setData(Uri.parse("tel:123456")); ``` - **系统交互**:通过隐式Intent调用系统功能(相机、拨号、地图等)[^1] #### 3. `android.content.pm.PackageManager` - **作用**:管理应用包信息和权限状态 - **核心用途**: - 检查权限状态: ```java int permissionStatus = checkSelfPermission(Manifest.permission.CALL_PHONE); ``` - 处理权限请求结果: ```java @Override public void onRequestPermissionsResult(int code, String[] permissions, int[] results) { if (results[0] == PackageManager.PERMISSION_GRANTED) { // 权限已授予 } } ``` #### 4. `android.net.Uri` - **作用**:统一资源标识符处理 - **使用场景**: - 解析资源路径:`Uri.parse("tel:123456")` - 构建Intent数据: ```java Intent intent = new Intent(Intent.ACTION_VIEW); intent.setData(Uri.parse("https://developer.android.com")); ``` #### 5. `android.os.Bundle` - **作用**:在Activity/Fragment间传递数据的键值对容器 - **典型用法**: ```java // 保存状态 @Override protected void onSaveInstanceState(Bundle outState) { outState.putString("phone_number", phoneNumber); super.onSaveInstanceState(outState); } // 恢复状态 @Override protected void onCreate(Bundle savedInstanceState) { if (savedInstanceState != null) { String number = savedInstanceState.getString("phone_number"); } } ``` #### 6. `android.widget.Button` - **作用**:用户交互控件,触发操作 - **实现逻辑**: ```java Button dialButton = findViewById(R.id.dial_button); dialButton.setOnClickListener(v -> { // 处理拨号逻辑 }); ``` #### 7. `android.widget.Toast` - **作用**:向用户显示简短提示信息 - **使用方式**: ```java // 权限被拒绝时提示 Toast.makeText(context, "需要电话权限才能拨号", Toast.LENGTH_SHORT).show(); ``` ### 协同工作流程 1. **权限检查**:使用`PackageManager`检查`Manifest.permission`状态 2. **用户交互**:通过`Button`触发操作 3. **数据传递**:使用`Bundle`保存临时状态 4. **组件调用**:通过`Intent`携带`Uri`启动系统功能 5. **用户反馈**:用`Toast`显示操作结果 ### 完整示例(拨号功能) ```java public class DialActivity extends AppCompatActivity { private static final int CALL_PHONE_REQUEST_CODE = 101; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_dial); Button dialBtn = findViewById(R.id.dialButton); dialBtn.setOnClickListener(v -> { // 检查权限 if (checkSelfPermission(Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) { requestPermissions(new String[]{Manifest.permission.CALL_PHONE}, CALL_PHONE_REQUEST_CODE); } else { makePhoneCall(); } }); } private void makePhoneCall() { try { Intent callIntent = new Intent(Intent.ACTION_CALL); callIntent.setData(Uri.parse("tel:11223344")); startActivity(callIntent); } catch (SecurityException e) { Toast.makeText(this, "权限错误:" + e.getMessage(), Toast.LENGTH_SHORT).show(); } } @Override public void onRequestPermissionsResult(int code, String[] permissions, int[] results) { if (code == CALL_PHONE_REQUEST_CODE && results[0] == PackageManager.PERMISSION_GRANTED) { makePhoneCall(); } else { Toast.makeText(this, "拨号需要电话权限", Toast.LENGTH_SHORT).show(); } } } ``` ### 权限管理演进 在Android 11+中,除了运行时权限,还需要注意**软件包可见性**问题。如果应用需要查询或交互其他应用(如拨号应用),需在AndroidManifest.xml中添加: ```xml <queries> <intent> <action android:name="android.intent.action.DIAL" /> </intent> </queries> ``` 这确保应用能检测到处理拨号Intent的系统组件[^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值