自定义消息提示框主要分为两部分
1、自定义消息提示框的布局
想要怎样的布局都可以自己定义,主要是根据 id 来控制每一个控件
创建 view_toast.xml 布局:
<LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:background="@drawable/radius_toast" android:orientation="horizontal"> <ImageView android:id="@+id/image_toast" android:layout_width="20dp" android:layout_height="18sp" android:layout_marginTop="2dp" android:background="@mipmap/ic_launcher"/> <TextView android:id="@+id/text_toast" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="16dp" android:text="我是自定义消息框"/> </LinearLayout>
LinearLayout 的 背景也是可以自定义的,我这里是这样的:
在 res/drawable 下面创建 radius_toast.xml ,内容如下:
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android"> <corners android:radius="15dp"/> <solid android:color="#CCCCCC"/> <padding android:left="10dp" android:top="10dp" android:right="10dp" android:bottom="10dp" /> </shape>
在 radius_toast.xml 里定义了圆角、背景色和内边距
2、自定义消息提示框的“adapter”
创建一个 类,用于适配自定义的布局
import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; import com.win.customview.R; public class MyToast{ private Toast toast; public MyToast(Context context,int image,String texts) { //加载布局 LayoutInflater layoutInflater = LayoutInflater.from(context); View view = layoutInflater.inflate(R.layout.view_toast,null); //设置图片 (通过 view ) ImageView imageView=(ImageView)view.findViewById(R.id.image_toast); imageView.setBackgroundResource(image); //设置文字 (通过 view ) TextView textView = (TextView) view.findViewById(R.id.text_toast); textView.setText(texts); if (toast != null) { toast.cancel(); } toast = new Toast(context); toast.setDuration(Toast.LENGTH_SHORT); toast.setView(view); //将布局放入 Toast toast.show(); } }
在这里可以看到,需要向 MyToast
传入 Context(上下文)、int(图片 R.mipmap.ic_launcher)、以及String(弹出来的文字)
通过向view设置图片、文字 最终将布局放入 Toast 以达到自定义的效果
像我这里,只有一张图片和一段文字,就只设置图片和设置文字就行了,
如果有更多的图文,也是一样的通过id关联起来就好了!!!
提示:需要怎样的布局都可以自己定义,在这个自定义的适配器中利用id关联起来就行了
最后的调用
import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import com.win.customview.R; public class ToastActivity extends AppCompatActivity { private Button my_toast; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_toast); my_toast = (Button)findViewById(R.id.my_toast); my_toast.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { //这里调用自定义的消息框 MyToast myToast = new MyToast(ToastActivity.this,R.mipmap.ic_launcher,"12335"); } }); } }
这调用的核心就一句
MyToast myToast = new MyToast(ToastActivity.this,R.mipmap.ic_launcher,"12335");
其中,Content就是 ToastActivity.this 它是上下文;
int就是 R.mipmap.ic_launcher 它是将要弹出来的图片;
String就是 "12335" 它是将要弹出来的文字
这里,点击Button,就会弹出如下
总结:自定义可以实现很多炫酷的效果,只是需要通过 id 绑定,以达到控制每一个控件的效果,布局都是可以自己定义的。
源码:https://github.com/iscopy/CustomView
在 toast 包里面