2017-05-26 22 views
2

我不明白为什么我的土司会崩溃应用程序。Android Toast.Set重力导致应用程序崩溃

我有两组代码,一组是我最初做的崩溃,一组是我发现正在工作。

正在工作的人创建敬酒对象并同时声明文本。

Toast toast = 
Toast.makeText(QuizActivity.this,R.string.incorrect_toast, Toast.LENGTH_SHORT); 
toast.setGravity(Gravity.CENTER, 0, 0); 
toast.show(); 

我做的那个在上下文中创建对象,设置文本然后设置重力并尝试显示它。

Toast toast = new Toast(QuizActivity.this); 
toast.makeText(QuizActivity.this, 
       R.string.correct_toast, 
       Toast.LENGTH_SHORT); 
toast.setGravity(Gravity.CENTER, 0, 0); 
toast.show(); 

为什么这会使我的应用程序崩溃?

+0

你可以添加一个堆栈跟踪到你的答案? –

+0

发布您的logcat –

+0

在第二个块中调用'makeText()'并没有做到您认为的那样。 'makeText()'是一个返回要使用的Toast的静态方法。这里没有初始化“吐司”。 –

回答

1

Toast toast = new Toast(QuizActivity.this); 

构造一个空的吐司对象。您必须先调用setView(View),然后才能调用show()。

LayoutInflater inflater = getLayoutInflater(); 
View layout = inflater.inflate(R.layout.custom_toast, 
      (ViewGroup) findViewById(R.id.custom_toast_container)); 

TextView text = (TextView) layout.findViewById(R.id.text); 
text.setText("This is a custom toast"); 

Toast toast = new Toast(getApplicationContext()); 
toast.setGravity(Gravity.CENTER_VERTICAL, 0, 0); 
toast.setDuration(Toast.LENGTH_LONG); 
toast.setView(layout); 
toast.show(); 

如其在Android docs中所述。

+0

好的。所以我必须进入XML创建一个特殊的容器。如果我不只是通过设置文本从get go开始初始化它,用它来制作一个对象,然后用“toast”对它进行“绘制”。这似乎有点复杂。 – Elias

+0

粗略地说 - 是的。并将我的答案标记为正确:)。 – isabsent

1

你可以试试这个

Toast toast = Toast.makeText(QuizActivity.this,"your string", Toast.LENGTH_LONG); 
toast.setGravity(Gravity.CENTER, 0, 0); 
toast.show(); 
+0

@ratilala chopda正确答案 –

1

您可以像这样创建一个烤面包对象。

Toast toast = new Toast(QuizActivity.this); 

这行代码构造一个空的Toast对象。

然后您必须自己拨打setView(),setDuration()makeText()方法是一种静态方法。所以,你不能从吐司对象中调用它。

您可以通过调用方法makeText()方法来初始化Toast对象。

因此,第一个代码工作正常,第二个代码不正常。

+0

当我以这种方式创建吐司对象时,它在做什么? – Elias

0

 这是崩溃,因为在调用show mehod之前您没有调用setView()方法。

 调用构造函数(Toast toast = new Toast(QuizActivity.this);)将建立一个空Toast object.This对象将不包含默认视图显示,所以你要调用的setView()方法来设置视图的toast.Then仅此将工作。

0

很可能你会得到RuntimeException

'了java.lang.RuntimeException:的setView必须已经调用'

你只是创造Toast uisng "new Toast(QuizActivity.this)"一个instance和你没有设置任何看法吧。您必须将自己的自定义layout设置为Toast

SOLUTION:

LayoutInflater inflate = (LayoutInflater) 
     this.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

// Custom layout 
View view = inflate.inflate(R.layout.custom_toast, null); 
TextView tv = (TextView) view.findViewById(R.id.textView); 
tv.setText("Hello world!"); 

// Toast 
Toast toast = new Toast(QuizActivity.this); 
toast.setGravity(Gravity.CENTER, 0, 0); 
toast.setDuration(Toast.LENGTH_SHORT); 

// Set the Toast custom layout 
toast.setView(view); 
toast.show(); 

这里是custom_toast.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:orientation="horizontal" 
    android:layout_margin="5px" 
    android:padding="10dp" 
    android:layout_gravity="center_horizontal"> 

    <LinearLayout 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content"> 

     <ImageView 
      android:id="@+id/imageView" 
      android:src="@mipmap/ic_launcher" 
      android:layout_width="50dp" 
      android:layout_height="50dp"/> 

     <TextView 
      android:id="@+id/textView" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:padding="3dp" 
      android:text="Android Tutorial Custom Toast" 
      android:textColor="#fff" 
      android:textSize="16dp" 
      android:layout_gravity="center_vertical"/> 

    </LinearLayout> 
</LinearLayout> 

希望这将有助于〜