Use android tv leanback in easy way
allProjects
{
repositories {
// required to find the project's artifacts
maven { url "https://www.jitpack.io" }
}
} dependencies {
implementation 'com.github.humatv:HumaLeanbackLibs:1.2.1'
}first, You should create a item View to show in lists as below:
if You have model like a video class what you want to show of data like:
public class Video {
public String name;
public String imageUrl;
public String videoUrl;
public Video(String name) {
this.name = name;
}
public Video() {
}
public static class MyVideoView extends MyBaseCardView<Video> { // this class convert video model to view
public MyVideoView(Context context, int layoutResId) {
super(context, layoutResId);
}
@Override
public void fillData(Video video) { // this method call automatically for all of your items in list
TextView textView = findViewById(R.id.Textview);
textView.setText(video.name);
}
@Override
protected void changeSelected(boolean selected, int pos) { // if selected item changed : this method call
}
}
}
and you must create layout.xml for items like this:
<?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="vertical">
<ImageView
android:id="@+id/imageview"
android:layout_width="200dp"
android:layout_height="200dp"
android:src="@mipmap/ic_launcher" />
<TextView
android:id="@+id/Textview"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#BC42C9"
android:gravity="center_vertical"
android:text="فیلم "
/>
</LinearLayout>
public class TestBaseBrowseFragment extends BaseBrowseFragment {
ArrayObjectAdapter mRowsAdapter;
@Override
public void initial() {
setShowHeader(true); // show navigation Menu
// set fastLane (or headers) background color
setBrandColor(ResourcesCompat.getColor(getResources(), R.color.fastlane_background, null));
// set search icon color
setSearchAffordanceColor(Color.TRANSPARENT);
MyListRowPresenter p = new MyListRowPresenter(); // this presenter for vertical rows
p.setRtl(true); // change rtl of page
p.setShadowEnabled(true);
mRowsAdapter = new ArrayObjectAdapter(p); // this adapter for vertical rows
BasePresenter<Video, Video.MyVideoView> cardPresenter = new BasePresenter<>(getActivity(), Video.MyVideoView.class, R.layout.item_video); // this presenter for horizontal rows
ArrayObjectAdapter adapter1 = new ArrayObjectAdapter(cardPresenter); // this adapter for horizontal rows
for (int i = 0; i < 10; i++) {
adapter1.add(new Video());
}
IconHeaderItem headerItem = new IconHeaderItem("Header");
headerItem.setTypeface(...); // set typeface for headers
// here we have 3 copy rows, you can create some more adapter and presenter
mRowsAdapter.add(new ListRow(headerItem, adapter1));
mRowsAdapter.add(new ListRow(headerItem, adapter1));
mRowsAdapter.add(new ListRow(headerItem, adapter1));
setAdapter(mRowsAdapter);
// if you have title, you should create it in layout as xml file and use it here
setTitleView(R.layout.custom_titleview, R.id.search_orb, new CustomTitleView.OnTitleReadyListener() {
@Override
public void onReady(View v) {
// here you can find views and set datas
}
});
setOnSearchClickedListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(getContext(), "hello", Toast.LENGTH_SHORT).show();
}
});
setBackgroundUri("URL", false);
}
@Override
public void onItemSelectedListener(View v, Object item, int rowPos, int pos) {
Log.d("TestBaseBrowseFragment", "selected= " + rowPos + " : " + pos);
}
@Override
public void onItemClickListener(View v, Object item, int rowPos, int pos) {
}
}
if you want to show just some rows you can use it
public class TestBaseRowsFragment extends BaseRowsFragment {
ArrayObjectAdapter mRowsAdapter;
@Override
public void initial() {
MyListRowPresenter p = new MyListRowPresenter();
// p.setHorizontalNumRows(3);
// p.setRtl(true);
// p.setShadowEnabled(true);
mRowsAdapter = new ArrayObjectAdapter(p);
setAlignment(100);
BasePresenter<Video, Video.MyVideoView> cardPresenter = new BasePresenter<Video, Video.MyVideoView>(getActivity(), Video.MyVideoView.class, R.layout.item_video);
ArrayObjectAdapter adapter1 = new ArrayObjectAdapter(cardPresenter);
cardPresenter.setAdapter(adapter1);
for (int i = 0; i < 10; i++) {
adapter1.add(new Video());
}
IconHeaderItem headerItem = new IconHeaderItem("hello");
// headerItem.setTypeface(FontManager.instance().getTypeface());
mRowsAdapter.add(new ListRow(headerItem, adapter1));
setAdapter(mRowsAdapter);
}
@Override
public void onItemSelectedListener(View v, Object item, int rowPos, int pos) {
Log.d("TestBaseBrowseFragment", "selected= " + rowPos + " : " + pos);
}
@Override
public void onItemClickListener(View v, Object item, int rowPos, int pos) {
}
}
public class TestGridFragment extends BaseGridFragment {
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
VerticalGridPresenter presenter = new VerticalGridPresenter(FocusHighlight.ZOOM_FACTOR_LARGE, false);
presenter.setShadowEnabled(false);
presenter.setNumberOfColumns(3);
setGridPresenter(presenter);
BasePresenter<Video, Video.MyVideoView> cardPresenter = new BasePresenter<>(getActivity(), Video.MyVideoView.class, R.layout.item_video);
ArrayObjectAdapter adapter1 = new ArrayObjectAdapter(cardPresenter);
cardPresenter.setAdapter(adapter1);
for (int i = 0; i < 10; i++) {
adapter1.add(new Video());
}
setAdapter(adapter1);
}
@Override
public void initial() {
}
@Override
public void onItemSelectedListener(View v, Object item, int rowPos, int pos) {
}
@Override
public void onItemClickListener(View v, Object item, int rowPos, int pos) {
}
}
public class TestFragmentFactory extends BaseBrowseFragment {
ArrayObjectAdapter mRowsAdapter;
@Override
public void initial() {
mRowsAdapter = new ArrayObjectAdapter(new MyListRowPresenter());
PageRowFragmentFactory factory = new PageRowFragmentFactory(getActivity(), mRowsAdapter, this);
factory.addFragment(1, new TestGridFragment());
factory.addFragment(2, new TestGridFragment());
factory.addFragment(3, new TestBaseRowsFragment());
getMainFragmentRegistry().registerFragment(PageRow.class, factory);
setAdapter(mRowsAdapter);
createRows();
startEntranceTransition();
setBackgroundUri("URL", false);
}
private void createRows() {
IconHeaderItem headerItem1 = new IconHeaderItem(1, "test1", null);
// headerItem1.setTypeface(FontManager.instance().getTypeface());
PageRow pageRow1 = new PageRow(headerItem1);
mRowsAdapter.add(pageRow1);
IconHeaderItem headerItem3 = new IconHeaderItem(3, "test3", null);
// headerItem1.setTypeface(FontManager.instance().getTypeface());
PageRow pageRow3 = new PageRow(headerItem3);
mRowsAdapter.add(pageRow3);
IconHeaderItem headerItem2 = new IconHeaderItem(2, "test2", null);
// headerItem2.setTypeface(FontManager.instance().getTypeface());
PageRow pageRow2 = new PageRow(headerItem2);
mRowsAdapter.add(pageRow2);
}
@Override
public void onItemSelectedListener(View v, Object item, int rowPos, int pos) {
Toast.makeText(getContext(), "selected :" + pos, Toast.LENGTH_SHORT).show();
}
@Override
public void onItemClickListener(View v, Object item, int rowPos, int pos) {
}
}
public class TestGuidedStepFragment extends BaseGuidedStepFragment {
@Override
public void initial() {
setActionTypeface(Typeface.createFromAsset(getActivity().getAssets(),"fonts/IRANSans.ttf"));
setTitleTypeface(Typeface.createFromAsset(getActivity().getAssets(),"fonts/IRANSans.ttf"));
setStyle(R.style.MyLeanbackWizard);
setGuidance(new GuidanceStylist.Guidance("عنوان",
"توضیحات کامل",
"بالای توضیحات", getResources().getDrawable(R.mipmap.ic_launcher)));
for(int i=0;i<100;i++){
addActions(GuidedStepsUtil.getAction(1, "اکشن : "+ i, "زیر اکشن", getContext()));
}
}
@Override
public void onItemSelectedListener(View v, Object item, int rowPos, int pos) {
}
@Override
public void onItemClickListener(View v, Object item, int rowPos, int pos) {
}
}
<style name="MyLeanbackWizard" parent="Theme.Leanback.GuidedStep">
<item name="guidedActionsBackground">@color/white</item>
<item name="guidedStepBackground">#2196F3</item>
<item name="guidedActionItemTitleStyle">
@style/myGuidedActionItemTitleStyle
</item>
<item name="guidanceDescriptionStyle">
@style/MyGuidanceDescriptionStyle
</item>
<item name="guidedActionItemDescriptionStyle">
@style/myGuidedActionItemDescriptionStyle
</item>
<item name="guidedActionItemContentStyle">
@style/myGuidedActionItemContentStyle
</item>
<item name="guidedActionsSelectorDrawable">@drawable/guided_step_action_selector</item>
<item name="android:colorAccent">#009C60</item>
<item name="android:colorControlNormal">#000000</item>
<item name="guidanceContainerStyle">
@style/myGuidanceContainerStyle
</item>
</style>
<style name="MyGuidanceDescriptionStyle" parent="Widget.Leanback.GuidanceDescriptionStyle">
<item name="android:textColor">@color/text_color_black</item>
</style>
<style name="myGuidedActionItemTitleStyle" parent="Widget.Leanback.GuidedActionItemTitleStyle">
<item name="android:textColor">#646464</item>
</style>
<style name="myGuidedActionItemDescriptionStyle" parent="Widget.Leanback.GuidedActionItemDescriptionStyle">
<item name="android:textColor">@color/text_color_black</item>
<item name="android:alpha">1.0</item>
<item name="android:maxLines">20</item>
</style>
<style name="myGuidedActionItemContentStyle" parent="Widget.Leanback.GuidedActionItemContentStyle">
<item name="android:textColor">@color/text_color_black</item>
</style>
<style name="myGuidanceContainerStyle" parent="Widget.Leanback.GuidanceContainerStyle">
<!--<item name="android:layout_height">wrap_content</item>-->
<item name="android:layout_marginTop">-150dp</item>
</style>
public class TestSearchFragment extends BaseSearchFragment {
String[] str = {"علی", "علیرضا", "محمد علی", "جواد", "رضا", "حامد", "اضغر", "حمید", "محمد رضا", "علی اکبر", "اکبر"};
ArrayObjectAdapter adapter1;
@Override
public void initial() {
MyListRowPresenter p = new MyListRowPresenter();
setAdapter(new ArrayObjectAdapter(p));
setRtl();
BasePresenter<Video, Video.MyVideoView> cardPresenter = new BasePresenter<>(getActivity(), Video.MyVideoView.class, R.layout.item_video);
adapter1 = new ArrayObjectAdapter(cardPresenter);
IconHeaderItem headerItem = new IconHeaderItem("نام ها");
getAdapter().add(new ListRow(headerItem, adapter1));
setTypeface(Typeface.createFromAsset(getActivity().getAssets(), "fonts/IRANSans.ttf"));
startRecognition();
}
@Override
public void onItemSelectedListener(View v, Object item, int rowPos, int pos) {
}
@Override
public void onItemClickListener(View v, Object item, int rowPos, int pos) {
}
@Override
public boolean onQueryTextChange(String newQuery) {
return false;
}
@Override
public boolean onQueryTextSubmit(String query) {
adapter1.clear();
for (int i = 0; i < str.length; i++) {
if (str[i].indexOf(query) != -1)
adapter1.add(new Video(str[i]));
}
return false;
}
}
public class TestDetailFragment extends BaseDetailFragment {
@Override
public void initial() {
addAction(new Action(1, "hello"));
setLogoDrawable(getResources().getDrawable(R.mipmap.ic_launcher));
setBackgrouundDrawable(getResources().getDrawable(R.drawable.test));
setBackgroundColor(Color.YELLOW);
BasePresenter<Video, Video.MyVideoView> cardPresenter = new BasePresenter<>(getActivity(), Video.MyVideoView.class, R.layout.item_video);
ArrayObjectAdapter adapter1 = new ArrayObjectAdapter(cardPresenter);
for (int i = 0; i < 10; i++) {
adapter1.add(new Video());
}
IconHeaderItem headerItem = new IconHeaderItem("hello");
// headerItem.setTypeface(FontManager.instance().getTypeface());
getAdapter().add(new ListRow(headerItem, adapter1));
getAdapter().notifyItemRangeChanged(getAdapter().size()-1,1);
}
@Override
public void onItemSelectedListener(View v, Object item, int rowPos, int pos) {
}
@Override
public void onItemClickListener(View v, Object item, int rowPos, int pos) {
Toast.makeText(getContext(), "click!", Toast.LENGTH_SHORT).show();
}
@Override
public DetailsOverviewRow getDetailsOverview() {
setDetailsView(R.layout.detail_view_content, new DetailsDescriptionPresenter.OnViewReady<Video>() {
@Override
public void onReady(View v, Video o) {
}
});
return new DetailsOverviewRow(new Video("+18"));
}
}
public class TestSearchGridFragment extends BaseSearchGridFragment {
String[] str = {"علی", "علیرضا", "محمد علی", "جواد", "رضا", "حامد", "اضغر", "حمید", "محمد رضا", "علی اکبر", "اکبر"};
ArrayObjectAdapter adapter1;
@Override
public void initial() {
// setmRowsSupportFragment(new TestGridFragment());
VerticalGridPresenter presenter = new VerticalGridPresenter(FocusHighlight.ZOOM_FACTOR_LARGE, false);
presenter.setShadowEnabled(false);
presenter.setNumberOfColumns(3);
setGridPresenter(presenter);
BasePresenter<Video, Video.MyVideoView> cardPresenter = new BasePresenter<>(getActivity(), Video.MyVideoView.class, R.layout.item_video);
adapter1 = new ArrayObjectAdapter(cardPresenter);
cardPresenter.setAdapter(adapter1);
// for (int i = 0; i < 10; i++) {
// adapter1.add(new Video());
// }
setAdapter(adapter1);
startRecognition();
setBackgroundDrawable(getResources().getDrawable(R.color.colorAccent),false);
}
@Override
public void onItemSelectedListener(View v, Object item, int rowPos, int pos) {
}
@Override
public void onItemClickListener(View v, Object item, int rowPos, int pos) {
}
@Override
public boolean onQueryTextChange(String newQuery) {
Toast.makeText(getActivity(), "change : "+newQuery, Toast.LENGTH_SHORT).show();
return false;
}
@Override
public boolean onQueryTextSubmit(String query) {
Toast.makeText(getActivity(), "sumbit : "+query, Toast.LENGTH_SHORT).show();
adapter1.clear();
for (int i = 0; i < str.length; i++) {
if (str[i].indexOf(query) != -1)
adapter1.add(new Video(str[i]));
}
return false;
}
}
First way :Adding Activity
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/frameLayout"
tools:context=".MainActivity"/>
public class MainActivity extends FragmentActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
FragmentTransaction tx = getSupportFragmentManager().beginTransaction();
TestFragment t = new TestFragment();
t.setArguments(getIntent().getExtras());
tx.replace(R.id.frameLayout, t, "mainFragment");
tx.commit();
}
}
Or Second way with Huma Lib:
Bundle b= new Bundle();
b.putString("key","value");
boolean isRtl = true;
HumaUtil.startFragment(context, TestGuidedStepFragment.class, b, isRtl);






