• Android开发中的Toast的使用方法详解
  • 顺风顺水 发表于 2016/3/18 13:01:00 | 分类标签: Android开发 Toast用法
  • Toast是一种没有交点,显示时间有限,不能与用户进行交互,用于显示提示信息的显示机制,我们可以把它叫做提示框。Toast不依赖 于Activity,也就是说,没有Activity,依然可以使用Toast。 

    Android的四大组件:Activity, Service, Broadcast Receiver, Contet Provider,都是继承Context的(Context,现在大家称之为上下文,之前又被翻译为句柄),包括整个Application也是继承于Context的。Toast就是依赖于应用程序Application的Context。

    项目结构
    代码实现

    MainActivity.java:
    package com.example.linux.customtoasttest;
    import android.os.Bundle;
    import android.support.v7.app.AppCompatActivity;
    import android.view.Gravity;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.TextView;
    import android.widget.Toast;
    /**
    * writer: 胡红翔
    * function: 自定义toast,以及toast的简单使用
    */
    public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    }
    // toast:位置的改变
    public void toast1(View view) {
    Toast toast = Toast.makeText(MainActivity.this, "toast", Toast.LENGTH_LONG);
    toast.setGravity(Gravity.BOTTOM | Gravity.LEFT, 0, 0);
    toast.show();
    }
    //toast:自定义Toast
    public void customToast(View view) {
    LayoutInflater inflater = getLayoutInflater();
    ViewGroup viewGroup = (ViewGroup) findViewById(R.id.toast_layout_root);
    View layout = inflater.inflate(R.layout.toast_layout, viewGroup);
    TextView text = (TextView) layout.findViewById(R.id.textView);
    text.setText("This is a custom toast");
    Toast toast = new Toast(MainActivity.this);
    toast.setGravity(Gravity.CENTER_VERTICAL, 0, 0);
    toast.setDuration(Toast.LENGTH_LONG);
    toast.setView(layout); // 自定义View
    toast.show();
    }
    }
     activity_main.xml:
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.example.linux.customtoasttest.MainActivity">
    <TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Hello World!" />
    <Button
    android:text="ToastPosition"
    android:onClick="toast1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />
    <Button
    android:text="CustomToast"
    android:onClick="customToast"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />
    </LinearLayout>
     toast_layout.xml:
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/toast_layout_root"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="#DAAA"
    android:orientation="horizontal"
    android:padding="8dp">
    <ImageView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginRight="8dp"
    android:src="@mipmap/ic_launcher" />
    <TextView
    android:id="@+id/textView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textColor="#FFF" />
    </LinearLayout>
    实现原理

    toast的makeText方法:得到一些信息,生成一个View
    Toast result = new Toast(context);
    LayoutInflater inflate = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View v = inflate.inflate(com.android.internal.R.layout.transient_notification, null);
    TextView tv = (TextView)v.findViewById(com.android.internal.R.id.message);
    tv.setText(text);
    result.mNextView = v;
    result.mDuration = duration;
    return result;
    toast的show方法:这个比较难,表示没怎么看懂,后续再做补充。大概的是add(view)让上述view显示,开启了一个线程不断轮询(估计是duration),启动了一个通知服务。
    // 窗口管理类
    mWM = (WindowManager)context.getSystemService(Context.WINDOW_SERVICE);
    ......
    mWM.addView(mView, mParams);
    // 绑定事件
    trySendAccessibilityEvent();
  • 请您注意

    ·自觉遵守:爱国、守法、自律、真实、文明的原则

    ·尊重网上道德,遵守《全国人大常委会关于维护互联网安全的决定》及中华人民共和国其他各项有关法律法规

    ·严禁发表危害国家安全,破坏民族团结、国家宗教政策和社会稳定,含侮辱、诽谤、教唆、淫秽等内容的作品

    ·承担一切因您的行为而直接或间接导致的民事或刑事法律责任

    ·您在编程中国社区新闻评论发表的作品,本网站有权在网站内保留、转载、引用或者删除

    ·参与本评论即表明您已经阅读并接受上述条款

  • 感谢本文作者
  • 作者头像
  • 昵称:顺风顺水
  • 加入时间:2013/7/16 0:00:00
  • TA的签名
  • 这家伙很懒,虾米都没写
  • +进入TA的空间
  • 以下内容也很赞哦
分享按钮