Contents
ErrorActivity & ErrorFragment
ErrorFragment is one of another layouts supported by Leanback library.
ErrorActivity
New -> Java Class -> Name: ErrorActivity
* We don’t use layout file for showing ErrorActivity.
Basically, it just attaches ErrorFragment.
package com.corochann.androidtvapptutorial;
import android.app.Activity;
import android.os.Bundle;
/**
* Created by corochann on 7/7/2015.
*/
public class ErrorActivity extends Activity {
private static final String TAG = ErrorActivity.class.getSimpleName();
private ErrorFragment mErrorFragment;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
testError();
}
private void testError() {
mErrorFragment = new ErrorFragment();
getFragmentManager().beginTransaction().add(R.id.main_browse_fragment, mErrorFragment).commit();
}
}
ErrorFragment
New -> Java Class -> Name: ErrorFragment
* We don’t use layout file for showing ErrorActivity.
ErrorFragment class is a subclass of android.support.v17.leanback.app.ErrorFragment.
package com.corochann.androidtvapptutorial;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
/**
* Modified from AOSP sample code by corochann on 7/7/2015.
* This class demonstrates how to extend ErrorFragment
*/
public class ErrorFragment extends android.support.v17.leanback.app.ErrorFragment {
private static final String TAG = ErrorFragment.class.getSimpleName();
private static final boolean TRANSLUCENT = true;
@Override
public void onCreate(Bundle savedInstanceState) {
Log.d(TAG, "onCreate");
super.onCreate(savedInstanceState);
setTitle(getResources().getString(R.string.app_name));
setErrorContent();
}
void setErrorContent() {
setImageDrawable(getActivity().getDrawable(R.drawable.lb_ic_sad_cloud));
setMessage(getResources().getString(R.string.error_fragment_message));
setDefaultBackground(TRANSLUCENT);
setButtonText(getResources().getString(R.string.dismiss_error));
setButtonClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
getFragmentManager().beginTransaction().remove(ErrorFragment.this).commit();
}
});
}
}
Modify AndroidManifest.xml to declare ErrorActivity,
<application>
...
<activity android:name=".ErrorActivity" />
</application>
Implement action to launch ErrorActivity
I will change the name of item of GridItemPresenter “Item 1” -> “ErrorFragment”, and I will launch this ErrorActivity by clicking this “ErrorFragment” item.
Modify MainFragment, to launch ErrorActivity by intent.
private void loadRows() {
...
//gridRowAdapter.add("ITEM 1");
gridRowAdapter.add("ErrorFragment");
...
}
@Override
public void onItemClicked(Presenter.ViewHolder itemViewHolder, Object item,
RowPresenter.ViewHolder rowViewHolder, Row row) {
// each time the item is clicked, code inside here will be executed.
if (item instanceof Movie) {
Movie movie = (Movie) item;
Log.d(TAG, "Item: " + item.toString());
Intent intent = new Intent(getActivity(), DetailsActivity.class);
intent.putExtra(DetailsActivity.MOVIE, movie);
getActivity().startActivity(intent);
} else if (item instanceof String){
if (item == "ErrorFragment") {
Intent intent = new Intent(getActivity(), ErrorActivity.class);
startActivity(intent);
}
}
}
<resources>
<string name="app_name">AndroidTVappTutorial</string>
<string name="title_activity_main">MainActivity</string>
<string name="hello_world">Hello world!</string>
<string name="action_settings">Settings</string>
<string name="title_activity_details">DetailsActivity</string>
<string name="error">Error</string>
<!-- Error messages -->
<string name="video_error_media_load_timeout">Media loading timed out</string>
<string name="video_error_server_inaccessible">Media server was not reachable</string>
<string name="video_error_unknown_error">Failed to load video</string>
<string name="error_fragment_message">An error occurred</string>
<string name="dismiss_error">Dismiss</string>
<string name="oops">Oops</string>
</resources>
Build and run
By clicking “ErrorFragment” item, ErrorFragment will show Error message with images.

* AOSP project, SpinnerFragment is also implemented to show loading animation. But I introduced a minimum implementation/usage of ErrorFragment here.
Source code is on github.
