【问题标题】:I just need to override show() for the Toast class我只需要覆盖 Toast 类的 show()
【发布时间】:2012-01-24 17:28:52
【问题描述】:

我只需要覆盖Toast 类的show() 方法。我创建了一个扩展 Toast 类的类,但随后我创建了一个 toast 消息,我收到一个异常 setView(View view) 尚未被调用。但我不想为该方法创建自定义View,而是使用默认方法。

那么,如何在不为 setView(View view) 方法创建自定义 View 的情况下覆盖唯一的 show() 方法?

这是我的工作:

 MyOwnToast m = new MyOwnToast(getApplicationContext());
        m.makeText(getApplicationContext(), "Bla bla bla", Toast.LENGTH_LONG);
        m.show();

我的自定义吐司在这里:

public class MyOwnToast extends Toast {
    public MyOwnToast(Context context) {
        super(context);
    }

    @Override
    public void show() {
        super.show();
        Log.i("Dev", "
}

dev site上也有说明:

注意:不要对 Toast 使用公共构造函数,除非你是 将使用 setView(View) 定义布局。如果您没有 要使用自定义布局,您必须使用 makeText(Context, int, int) 来 创建 Toast。

那么我该如何覆盖show() 方法呢?

【问题讨论】:

    标签: android


    【解决方案1】:

    您是否在覆盖范围内致电super.show()Toast.show() 可能正在调用它,而您的覆盖现在正在调用它,因此调用不会发生。

    你可能需要做的是这样的事情:

    public class MyOwnToast extends Toast {
        public MyOwnToast(Toast toast) {
            //Code to initialize your toast from the argument toast
    
            //Probably something like this:
            this.setView(toast.getView());
            this.setDuration(toast.getDuration());
            //etc. for other get/set pairs in Toast
        }
    
        public static MyMakeText(Context context, CharSequence text, int duration) {
            return new MyOwnToast(Toast.makeText(context, text, duration));
        }
    
        public void show() {
            //Your show override code, including super.show()
        }
    }
    

    然后,当您想使用它时,请执行以下操作:

    MyOwnToast.MyMakeText(activity, "Some text", Toast.LENGTH_LONG).show();
    

    填写时请参阅 Toast 文档作为参考:http://developer.android.com/reference/android/widget/Toast.html

    【讨论】:

    • 查看您的代码,您正在调用 m.makeText(),就好像它会初始化您的变量 m。实际上,makeText() 是静态的,并返回一个 Toast 对象,然后将其忽略。 m 仍然是未初始化的,所以当你调用 show() 时,你会得到错误。
    • 您可以在 MyOwnToast 上创建您自己的静态 makeText() 方法,然后相应地调用 Toast.makeText()。然后,您需要一个 MyOwnToast 的构造函数,该构造函数将 Toast 作为参数,以便 MyOwnToast 可以将 Toast 转换为 MyOwnToast 并返回它。然后,调用 MyOwnToast.makeText().show() 应该对你有用。
    • 我猜想在 java 中覆盖静态方法是行不通的,因为这些是在编译时而不是运行时解决的类级别方法...
    • Implicit super constructor Toast() is undefined. Must explicitly invoke another constructor 我收到了这个错误。
    • @Gunaseelan 如果您正在扩展 Toast 并且您的构造函数中没有 super(...) 调用,则会发生这种情况。当您的构造函数中没有这样的调用时,Java 会尝试为您调用 super()。但是如果你要扩展的类没有 0-arg 构造函数,它就不能这样做——你需要选择一个超类构造函数并自己调用它。
    【解决方案2】:

    更简单的方法:

    public class MyToast extends Toast { 
    public MyToast(Context context){ 
    super(context)
    this.setView(LayoutInflater.from(context).inflate(R.layout.activity_toast,null));
    }
    public void showMe(){
    super.show();
    }
    public static MyToast myMakeText(Context con,String message,int duration) { 
    MyToast mts = new MyToast(con); 
    View view = mts.getView(); 
    TextView messageArea = view.findViewById(R.id.toastTextView);
     messageArea.setText(message);
     mts.setDuration(duration);
    return mts;
    }}
    

    所以你会问:

    MyToast.myMakeText(this,"my message",7000).showMe();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多