Android Testing: Inflate and Display a custom Toast from Instrumentation
Asked Answered
R

2

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();
Radium answered 23/7, 2014 at 7:36 Comment(0)
H
1

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..

Hygrometric answered 23/7, 2014 at 9:24 Comment(0)
A
1

I believe the issue is to do with the context, you are trying to show a toast from your test applications R files but using the applications context via an activity, what you will want to do is get the test context from instrumentation and then create a layout inflater from that using the following.

 Context context = instrumentation.getContext();
 LayoutInflater li = LayoutInflater.from(context);
Alunite answered 23/7, 2014 at 9:41 Comment(1)
thanks, I get the Inflater in another way now but this would work as well I guessRadium

© 2022 - 2024 — McMap. All rights reserved.