Issue
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();
Solution
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..
Answered By - Sivakumar
0 comments:
Post a Comment
Note: Only a member of this blog may post a comment.