Android Testing: Inflate and Display a custom Toast from Instrumentation

0
0

I am trying to display a custom Toast but doing so from my automated test rather than from the application itself.

The layout inflation does not work though. Is it even possible to inflate views and from the test project and display those?

What does work is a standard Toast:

final Activity targetActivity = Solo.getCurrentActivity(); // Using Robotium to get current displayed Activity
Toast.makeText(targetActivity, "Hello from Instrumentation", Toast.LENGTH_SHORT).show();

What does NOT work is the following:

final Activity targetActivity = Solo.getCurrentActivity(); // Using Robotium to get current displayed Activity
LayoutInflater inflater = targetActivity.getLayoutInflater();
View layout = inflater.inflate(test.my.package.R.layout.my_custom_toast, null); // resource is located in test project
TextView text = (TextView) layout.findViewById(test.my.package.R.id.textToShow); // textview within the layout
text
.setText("Hello from Instrumentation"); // here I get the NullPointerException
Toast toast = new Toast(targetActivity);
toast
.setGravity(Gravity.CENTER_VERTICAL, 0, 0);
toast
.setDuration(Toast.LENGTH_LONG);
toast
.setView(layout);
toast
.show();


Solution

Get new LayoutInflater without reference to targetActivity

final Activity targetActivity = Solo.getCurrentActivity(); // Using Robotium to get current displayed Activity
// *** !!! ***
LayoutInflater inflater =
(LayoutInflater) getInstrumentation().getContext().getSystemService (Context.LAYOUT_INFLATER_SERVICE);
// getContext() , NOT getTargetContext()
View layout = inflater.inflate(test.my.package.R.layout.my_custom_toast, null); // resource is located in test project
TextView text = (TextView) layout.findViewById(test.my.package.R.id.textToShow); // textview within the layout
text
.setText("Hello from Instrumentation"); // here I get the NullPointerException
Toast toast = new Toast(targetActivity);
toast
.setGravity(Gravity.CENTER_VERTICAL, 0, 0);
toast
.setDuration(Toast.LENGTH_LONG);
toast
.setView(layout);
toast
.show();
  • You must to post comments
0
0

Hi Use the below codes:

import android.content.Context;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
import com.example.R;
public class DoToast extends Toast {
/** The Constant TOAST_DURATION. */
private static final int TOAST_DURATION=4000;
/** The layout. */
View layout;
/**
* Instantiates a new do toast.
*
* @param context the context
* @param text the text
*/

public DoToast(Context context, CharSequence text) {
super(context);
LayoutInflater inflater = (LayoutInflater) context.getSystemService (Context.LAYOUT_INFLATER_SERVICE);
layout
= inflater.inflate(R.layout.toast, null);
TextView textView = (TextView) layout.findViewById(R.id.text);
textView
.setText(text);
DoToast.this.setGravity(Gravity.CENTER_VERTICAL, 0, 0);
DoToast.this.setDuration(TOAST_DURATION);
DoToast.this.setView(layout);
DoToast.this.show();
}
}

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:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:padding="8dp"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:background="@drawable/toast_bg">
<TextView
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="5dp"
android:textColor="#000000" />
</LinearLayout>

And Style file:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle" >
<gradient
android:angle="90"
android:endColor="#ffffff"
android:startColor="#F2F2F2"
android:type="linear" />
<stroke
android:width="3dp"
android:color="#000000" />
</shape>

If you need to show toast then just use the below line:

new DoToast(this,"Testing");  

Let me know if you have any queries..

  • You must to post comments
Showing 1 result
Your Answer
Post as a guest by filling out the fields below or if you already have an account.
Name*
E-mail*
Website