精华内容
下载资源
问答
  • 自定义Toast

    2014-01-16 09:52:11
    但是有时我们的程序使用默认的Toast时会和程序的整体风格不搭配,这个时候我们就需要自定义Toast,使其与我们的程序更加融合。 使用自定义Toast,首先我们需要添加一个布局文件,该布局文件的结构和Act

    转自若水老师的文章http://blog.csdn.net/coolszy/article/details/6365825

    Android系统默认的Toast十分简洁,使用也非常的简单。但是有时我们的程序使用默认的Toast时会和程序的整体风格不搭配,这个时候我们就需要自定义Toast,使其与我们的程序更加融合。

    使用自定义Toast,首先我们需要添加一个布局文件,该布局文件的结构和Activity使用的布局文件结构一致,在该布局文件中我们需设计我们Toast的布局,例如:

    [xhtml] view plaincopy
    1. <?xml version="1.0" encoding="utf-8"?>  
    2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    3.     android:id="@+id/toast_layout_root"  
    4.     android:orientation="horizontal"  
    5.     android:layout_width="fill_parent"  
    6.     android:layout_height="fill_parent"  
    7.     android:padding="10dp"  
    8.     android:background="#DAAA"  
    9.     >  
    10.     <ImageView android:id="@+id/image"  
    11.                android:layout_width="wrap_content"  
    12.                android:layout_height="fill_parent"  
    13.                android:layout_marginRight="10dp"  
    14.                />  
    15.     <TextView android:id="@+id/text"  
    16.               android:layout_width="wrap_content"  
    17.               android:layout_height="fill_parent"  
    18.               android:textColor="#FFF"  
    19.               />  
    20. </LinearLayout>  

    在这个地方要注意,我们给LinearLayout添加的id属性,在后面的代码中我们需要使用到。在程序中,我们可以通过如下代码创建我们自己的Toast。

    1. /** 
    2.  * @author coolszy 
    3.  * @blog http://blog.csdn.net/coolszy 
    4.  */  
    5.   
    6. public class MainActivity extends Activity  
    7. {  
    8.     private Button btn;  
    9.   
    10.     @Override  
    11.     public void onCreate(Bundle savedInstanceState)  
    12.     {  
    13.         super.onCreate(savedInstanceState);  
    14.         setContentView(R.layout.main);  
    15.         btn = (Button) findViewById(R.id.btn);  
    16.         btn.setOnClickListener(new OnClickListener()  
    17.         {  
    18.             @Override  
    19.             public void onClick(View v)  
    20.             {  
    21.                 //获取LayoutInflater对象,该对象能把XML文件转换为与之一直的View对象  
    22.                 LayoutInflater inflater = getLayoutInflater();  
    23.                 //根据指定的布局文件创建一个具有层级关系的View对象  
    24.                 //第二个参数为View对象的根节点,即LinearLayout的ID  
    25.                 View layout = inflater.inflate(R.layout.toast_layout, (ViewGroup) findViewById(R.id.toast_layout_root));  
    26.                   
    27.                 //查找ImageView控件  
    28.                 //注意是在layout中查找  
    29.                 ImageView image = (ImageView) layout.findViewById(R.id.image);  
    30.                 image.setImageResource(R.drawable.head);  
    31.                 TextView text = (TextView) layout.findViewById(R.id.text);  
    32.                 text.setText("自定义Toast演示程序");  
    33.   
    34.                 Toast toast = new Toast(getApplicationContext());  
    35.                 //设置Toast的位置  
    36.                 toast.setGravity(Gravity.CENTER_VERTICAL, 00);  
    37.                 toast.setDuration(Toast.LENGTH_LONG);  
    38.                 //让Toast显示为我们自定义的样子  
    39.                 toast.setView(layout);  
    40.                 toast.show();  
    41.             }  
    42.         });  
    43.     }  
    44. }  

    运行效果:

     

    演示程序下载:http://u.115.com/file/f1f1a980d8


    展开全文
  • Activity与Fragment搭配使用时,Fragment中使用Toast频繁出现空指针异常的解决办法

    最近在做项目的时候,需要使用Toast显示一些提示,但是总是报出空指针异常。
    开始时是这样写的:

     Toast.makeText(getActivity().getApplicationContext(), "xxxxxxxxx",                                         
              Toast.LENGTH_LONG).show();

    后来改成:

    Toast.makeText(getActivity(), "xxxxxxxxx",Toast.LENGTH_LONG).show();                           

    依然是会报错,但是没有上面的那么频繁了。
    于是就从网上找资料,找到了以下这篇,也是与我一样的问题,看完后基本明白了。
    http://blog.csdn.net/u012338845/article/details/46646205

    我在我的代码里加了一个判断,空指针问题解决。

    if (getActivity() != null){
                    Toast.makeText(getActivity().getApplicationContext(), "xxxxxxx", Toast.LENGTH_LONG).show();
                    }

    这个解决方法应该还能改进,学习后再来改进。

    展开全文
  • Android开发中我们会经常用到Toast来在界面上打印提示信息,如果是在调试程序的时候,使用它打印一些中间过程的结果显然比使用Log更直观一些,因为我们运行程序时可以直接从设备中看到弹出来的结果,而Log打印的内容...

    Android开发中我们会经常用到Toast来在界面上打印提示信息,如果是在调试程序的时候,使用它打印一些中间过程的结果显然比使用Log更直观一些,因为我们运行程序时可以直接从设备中看到弹出来的结果,而Log打印的内容还要通过控制台去找。但是估计也有一些人遇到过一些问题,比如Toast没有弹出来,好像没有起作用,或者直接会报异常。一般大家应该也知道,很多情况下Toast主要还是在主线程中去使用,直接在子线程中去使用的时候会报异常:Can't toast on a thread that has not called Looper.prepare()。但是如果必须要在子线程中去使用,该怎么做?最开始我是通过下面图1.的方式去在子线程中使用Toast:

    图1.

    (如果使用这种方式,上面的代码逻辑当然可以自行优化,这里只举个简单例子)

    上面这种方式也就是封装一下原生的Toast,通过Handler将Toast的调用post到主线程去,注意:这里创建Handler实例的时候一定要传入上述图中的参数--Looper.getMainLooper()才行。可以验证,这种方式是可以直接在线程中弹出Toast的,其实这和我们平时在子线程中通过handler将更新UI的操作发送到主线程是一个意思。

    后来,我在网上又看到下面图2的封装方式:

    图2.

    然后你在子线程中去调用这个封装好的Toast,可以发现也是可以正常弹出的。而且,从代码上看,似乎这种方式比图1中的高级一些:首先,前面说了,Toast在子线程中直接使用时有个异常:Can't toast on a thread that has not called Looper.prepare(),这里就针对这个问题自己调用了prepare还有loop两个方法,然后在这两个方法中间调用Toast的相关方法就OK了,平时我们可很少直接使用这两个方法吧?是不是感觉技术含量高一点?其次,因为前面说了图1其实就是将显示Toast内容的逻辑发送到主线程的消息队列中的,而图2这确实就是在当前子线程中执行,这种方式似乎还可以给主线程减少负担,毕竟主线程要处理的事太多,动不动就给人家找点事,指望着这点事也得让主线程自己去做,不利于发挥多线程的优势。讲真,我是感觉就图1这点事对主线程的影响真的可以忽略不计了😂[笑哭.png]

    但是,你可能很快就会发现问题,调用这个封装的Toast能在子线程中弹出来是没问题的,但是调用这个封装的Toast之后的逻辑似乎没有执行?没错,就是没有执行。为什么?再去看一下这个封装好的Toast方法代码,是不是有Looper.loop()的调用?问题想必说到这也清楚了:loop方法内部是一个for(;;)的无限循环,调用了这个方法之后,循环无法结束,它后边的代码当然得不到执行。然后你可能会问:上面不是也调用了quit方法?答案是自己去看一下这个quit的源码吧,这里不贴出来了。主要的意思就是这个quit方法里面就是清空了消息队列,没有结束这个无限循环,并不是你想的那样退出了这个loop......

    总之,在子线程中通过自己调用Looper.prepare以及Looper.loop去使用Toast的话,本身可以,并且其他的主线程中的操作也可以放在这里(我没去验证),但是如果上面那样,这个loop之后还有其他的逻辑,那么这后面的就不能执行了。所以还是建议用图1中的方式去封装Toast,然后再去子线程中调用,如果不是子线程就不必进行这样的封装了。是否还有更好的其他方式,以及图2是否可以改动以后就行了?等着你给我答案,目前我没时间去探索[坏笑.jpg]

    下面再说Toast可能没有弹出,而且"没有"(注意这里的引号)异常出现的情况:

    你直接在某个地方使用原生的方式---Toast.makeText(context, content, Toast.LENGTH_LONG).show(),发现并没有Toast弹出,也没有像有的时候那样直接程序崩溃退出,这是怎么回事?这种情况基本可以说是你在子线程中直接使用了Toast,并且这个使用是在try...catch块中。因为本身直接在子线程中使用Toast就会像上面说的那样报异常,但是你如果这个Toast在try...catch块中,那么这个异常就被捕获了,也就没有崩溃,而直接到了catch中,所以Toast也没能弹出...就像下边这样的逻辑

    图3.

    如果你能看一下控制台的log,细心的话就能看到下图中的这样:

    图4。

    也就是代码逻辑从try中遇到Toast.make...开始后,异常就被catch捕获了,Toast根本没正常执行。

    其实,最难的是你可能之前并不知道你的这个Toast是在子线程中使用并且被try...catch包围,因为你可能看到的是在Toast附近并没有try...catch包围它,也没有开子线程,但是这只是它的周围没有,如果是包含这个Toast的方法是在子线程中调用,而且是包含在try...catch中呢?是不是间接的满足了上面的条件,一样的意思?或者更外层的调用是在子线程中并且被包含在try...catch中呢?不能只看局部这一点吧?比如下图5的简单例子:test1方法中直接使用Toast,紧接着test1被test2调用,test3中又调用了test2,并且加了try...catch,直到最后第4步这里开了子线程去调用test3...此时上边说的两种条件都具备了,结果最终就是在控制台logcat那里看到了类似于图4的打印。所以,如果只看Toast所在的直接代码块显然是分析不出来问题的。

    图5.

    怎么去确定Toast当前所在的线程是不是子线程?用Log打印一下这个Toast当前所在的线程id不就知道是不是在子线程中了吗

    总结:如果你对你当前要写Toast的地方的代码不熟,不确定你要写Toast的地方是否位于子线程中并且被try...catch包围,那么一定要用Toast的话,就用图1的封装方式吧。

    最后,希望这篇文章里的一些内容没有误导人,还有就是希望有更好的解决问题方式分享出来。

     

    展开全文
  • 关于自定义Toast

    2013-12-21 19:32:25
    但是有时我们的程序使用默认的Toast时会和程序的整体风格不搭配,这个时候我们就需要自定义Toast,使其与我们的程序更加融合。 使用自定义Toast,首先我们需要添加一个布局文件,该布局文件的结构和Activity使用的...
    Android系统默认的Toast十分简洁,使用也非常的简单。但是有时我们的程序使用默认的Toast时会和程序的整体风格不搭配,这个时候我们就需要自定义Toast,使其与我们的程序更加融合。
    使用自定义Toast,首先我们需要添加一个布局文件,该布局文件的结构和Activity使用的布局文件结构一致,在该布局文件中我们需设计我们Toast的布局,例如:

    <?xml version="1.0" encoding="utf-8"?> 
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/toast_layout_root" 
    android:orientation="horizontal" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:padding="10dp" 
    android:background="#DAAA" 
    > 
    <ImageView android:id="@+id/image" 
    android:layout_width="wrap_content" 
    android:layout_height="fill_parent" 
    android:layout_marginRight="10dp" 
    /> 
    <TextView android:id="@+id/text" 
    android:layout_width="wrap_content" 
    android:layout_height="fill_parent" 
    android:textColor="#FFF" 
    /> 
    </LinearLayout> 


    在这个地方要注意,我们给LinearLayout添加的id属性,在后面的代码中我们需要使用到。在程序中,我们可以通过如下代码创建我们自己的Toast。

    /** 
    * @author coolszy 
    * @blog http://blog.csdn.net/coolszy 
    */ 
    
    public class MainActivity extends Activity 
    { 
    private Button btn; 
    
    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    btn = (Button) findViewById(R.id.btn); 
    btn.setOnClickListener(new OnClickListener() 
    { 
    @Override 
    public void onClick(View v) 
    { 
    //获取LayoutInflater对象,该对象能把XML文件转换为与之一直的View对象 
    LayoutInflater inflater = getLayoutInflater(); 
    //根据指定的布局文件创建一个具有层级关系的View对象 
    //第二个参数为View对象的根节点,即LinearLayout的ID 
    View layout = inflater.inflate(R.layout.toast_layout, (ViewGroup) findViewById(R.id.toast_layout_root));
    
    //查找ImageView控件 
    //注意是在layout中查找 
    ImageView image = (ImageView) layout.findViewById(R.id.image); 
    image.setImageResource(R.drawable.head); 
    TextView text = (TextView) layout.findViewById(R.id.text); 
    text.setText("自定义Toast演示程序"); 
    
    Toast toast = new Toast(getApplicationContext()); 
    //设置Toast的位置 
    toast.setGravity(Gravity.CENTER_VERTICAL, 0, 0); 
    toast.setDuration(Toast.LENGTH_LONG); 
    //让Toast显示为我们自定义的样子 
    toast.setView(layout); 
    toast.show(); 
    } 
    }); 
    } 
    } 



    运行效果:

    展开全文
  • 有时我们的程序使用默认的Toast时会和程序的整体风格不搭配,这个时候我们就需要自定义Toast,使其与我们的程序更加融合,使用自定义Toast,首先我们需要添加一个布局文件,该布局文件的结构和Activity使用的布局文件...
  • Android之自定义Toast

    2013-04-16 20:47:07
    但是有时我们的程序使用默认的Toast时会和程序的整体风格不搭配,这个时候我们就需要自定义Toast,使其与我们的程序更加融合。 使用自定义Toast,首先我们需要添加一个布局文件,该布局文件的结构和Activity使用的...
  • 自定义实现好看的toast

    千次阅读 2013-05-07 09:26:00
    系统已经给我们提供了toast,但是有时候风格和我们应用的整体风格不搭配,这个时候,我们需要,自定义来实现toast,比较简单。 主要代码如下: xml文件:  android:layout_width="match_parent"  android:...
  • <div><p>我使用了teaset组件库的toast组件,在App.js中,我设置一个用来处理初始路由的页面 <p>Navigator.setRoot({screen: {moduleName: routesName.initialRoute}}); 这个页面用来判断启动APP后显示...
  • 一种是加载的时候先是showloading,加载完成之后弹toast提示一下成功或者失败,这个toast关闭的特别快,后来发现showloading和hideloading必须得是搭配使用的,就是说如果showloading之后紧跟着showtoast的话是不行...
  • (个人经验,仅供参考,错误之处,敬请谅解) 适配器(Adapter) 在使用Spinner控件时,可以用...而在使用AutoCompleteTextView 控件时则必须要用到适配器来搭配使用: 提示信息(Toast) 对话框(AlertDialog) ...
  • 在前面的Design中,学习使用了TabLayout,NavigationView与...当然还有SnackBar,不过他在实际运用中一般都是和CoordinatorLayout搭配使用的。 先说下SnackBar,这个控件其实我觉得和Toast没什么差别,不过功...
  • 界面UI的测试(颜色、图标、字体、间距等的搭配) 导航的测试【导航是否直观、导航与页面结构、菜单、连接页面的风格是否一致】 图形的测试【自适应界面,内容根据窗口代销自适应、页面标签是否统一、图片质量要...
  • 本文讲述了如何一步步从0到1封装发布一个常用的toast组件的过程。本文是搭配实例书写的,所以理论上根据本文你可以自己成功打包发布一个自己的vue 组件。在文末有对应的项目地址可供参考。组件创建创建一个空文件...
  • 并且名字也有不同,有toast与alert的区分。2个弹窗在交互与色彩上都会尽可能的与系统搭配。弹窗的巧妙利用可以给予用户轻盈、和谐、流畅的三个感受。回过头来小程序,微信自带的用户交互与设计规范。但是产品经理...
  • 想请教一下本库与react-navigation如何搭配使用,譬如有一个Toast或者Confirm的确认弹窗只在当前页(Router)显示或交互而不会在上下级页面也显示,因为我查看内部实现是依托AppRegistry....
  • toast flutter_redux redux device_info 设备信息 connectivity 网络链接 flutter_markdown markdown解析 json_annotation json模板 json_serializable json模板 url_launcher 启动外部浏览器 ...

空空如也

空空如也

1 2 3
收藏数 50
精华内容 20
关键字:

toast搭配