Я создаю android ТВ-приложение, так как мне не нужно показывать видео, я создаю его обычным способом, например, создаю приложение для телефона.
После создания и тестирования на эмуляторе я решил сменить прослушиватель OnClick на OnFocusListener, но ничего не работает, все работает нормально с Onclicklistner
Ниже приведен код моей основной активности Recyclerview
public class MainActivity extends Activity {
TextView tvCurrentTime,tvCurrentDate;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
List<ModelHomeSelector> homeSelectorList = new ArrayList();
ModelHomeSelector object1 = new ModelHomeSelector();
object1.setSelectorTitle("Guest Directory");
object1.setSelectorImg(R.drawable.guestdirector);
homeSelectorList.add(object1);
ModelHomeSelector object2 = new ModelHomeSelector();
object2.setSelectorTitle("Restaurant & Bar");
object2.setSelectorImg(R.drawable.restaurandandbar);
homeSelectorList.add(object2);
ModelHomeSelector object3 = new ModelHomeSelector();
object3.setSelectorTitle("Leisure Facility");
object3.setSelectorImg(R.drawable.leisurefacility);
homeSelectorList.add(object3);
ModelHomeSelector object4 = new ModelHomeSelector();
object4.setSelectorTitle("Go Green");
object4.setSelectorImg(R.drawable.gogreeen);
homeSelectorList.add(object4);
ModelHomeSelector object5 = new ModelHomeSelector();
object5.setSelectorTitle("Promotions");
object5.setSelectorImg(R.drawable.promotions);
homeSelectorList.add(object5);
ModelHomeSelector object6 = new ModelHomeSelector();
object6.setSelectorTitle("Tv Guide");
object6.setSelectorImg(R.drawable.tvguide);
homeSelectorList.add(object6);
RecyclerView rvSelector = findViewById(R.id.rv_home_selector);
rvSelector.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false));
HomeSelectorAdapter adapter = new HomeSelectorAdapter(this, homeSelectorList);
rvSelector.setAdapter(adapter);
// rvSelector.getChildAt(2).requestFocus();
adapter.notifyDataSetChanged();
tvCurrentTime=findViewById(R.id.tvCurrentTime);
tvCurrentDate=findViewById(R.id.tvCurrentDate);
String date =DateFormat.getTimeInstance(DateFormat.SHORT).format(new Date());
tvCurrentTime.setText(date);
long dates = System.currentTimeMillis();
SimpleDateFormat sdf = new SimpleDateFormat("EEEE, dd/ MM/ yyyy");
String dateString = sdf.format(dates);
tvCurrentDate.setText(dateString);
}
}
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv_home_selector"
android:layout_width="match_parent"
android:layout_marginStart="30dp"
android:layout_centerVertical="true"
android:layout_height="wrap_content"
android:layoutAnimation="@anim/layout_animation"
android:descendantFocusability="afterDescendants"
android:focusedByDefault="true"
android:focusable="true"
android:focusableInTouchMode="true"
app:layout_behavior="@string/appbar_scrolling_view_behavior"/>
Класс адаптера
public class HomeSelectorAdapter extends RecyclerView.Adapter<HomeSelectorAdapter.ViewHolder> {
private List<ModelHomeSelector> homeSelectorList = new ArrayList<>();
int row_index=0;
Context context;
public HomeSelectorAdapter(Context context, List<ModelHomeSelector> homeSelectorList) {
this.context = context;
this.homeSelectorList = homeSelectorList;
}
@NonNull
@Override
public HomeSelectorAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.row_home, parent, false);
itemView.setFocusable(true);
itemView.setFocusableInTouchMode(true);
return new ViewHolder(itemView);
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, @SuppressLint("RecyclerView") final int position) {
final String selectorTitle = homeSelectorList.get(position).getSelectorTitle();
holder.selectorTitle.setText(selectorTitle);
holder.selectorImg.setImageResource(Integer.parseInt(String.valueOf(homeSelectorList.get(position).getSelectorImg())));
//holder.selectorCard.setBackgroundResource(R.drawable.circle);
//holder.selectorCard.setLayoutParams(new RelativeLayout.LayoutParams(270,270));
holder.selectorCard.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
Intent intent= new Intent(context, PrimaryBrowser.class);
intent.putExtra("card_name",selectorTitle);
//context.startActivity(intent);
Toast.makeText(context, "selected by d-pad", Toast.LENGTH_SHORT).show();
row_index=position;
notifyDataSetChanged();
}
});
if(row_index==position){
holder.selectorCard.setBackgroundResource(R.drawable.circle);
holder.selectorCard.setLayoutParams(new RelativeLayout.LayoutParams(250,250));
holder.selectorTitle.setTextSize(TypedValue.COMPLEX_UNIT_SP,10);
//holder.selectorImg.setMinimumHeight(50);
//holder.selectorImg.setMinimumWidth(50);
}
else
{
holder.selectorCard.setBackgroundResource(R.drawable.gray_circle);
holder.selectorCard.setLayoutParams(new RelativeLayout.LayoutParams(200 ,200));
holder.selectorTitle.setTextSize(TypedValue.COMPLEX_UNIT_SP,8);
}
/* holder.selectorCard.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent= new Intent(context, PrimaryBrowser.class);
intent.putExtra("card_name",selectorTitle);
context.startActivity(intent);
row_index=position;
notifyDataSetChanged();
}
});
//});
if(row_index==position){
holder.selectorCard.setBackgroundResource(R.drawable.circle);
holder.selectorCard.setLayoutParams(new RelativeLayout.LayoutParams(250,250));
holder.selectorTitle.setTextSize(TypedValue.COMPLEX_UNIT_SP,10);
//holder.selectorImg.setMinimumHeight(50);
//holder.selectorImg.setMinimumWidth(50);
}
else
{
holder.selectorCard.setBackgroundResource(R.drawable.gray_circle);
holder.selectorCard.setLayoutParams(new RelativeLayout.LayoutParams(200 ,200));
holder.selectorTitle.setTextSize(TypedValue.COMPLEX_UNIT_SP,8);
}*/
}
@Override
public int getItemCount() {
return homeSelectorList.size();
}
public class ViewHolder extends RecyclerView.ViewHolder {
public TextView selectorTitle;
public ImageView selectorImg;
public RelativeLayout selectorCard;
public ViewHolder(View itemView) {
super(itemView);
selectorCard = (RelativeLayout) itemView.findViewById(R.id.selector_card);
selectorTitle = (TextView) itemView.findViewById(R.id.tv_home_seletor);
selectorImg=(ImageView) itemView.findViewById(R.id.iv_home_selector);
}
}}
Манифест. xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.rimapps.myapplication">
<uses-permission android:name="android.permission.INTERNET" />
<uses-feature
android:name="android.hardware.touchscreen"
android:required="false" />
<uses-feature
android:name="android.software.leanback"
android:required="true" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/Theme.Leanback"
tools:ignore="GoogleAppIndexingWarning">
<activity android:name=".activity.GuestDirectoryActivity"></activity>
<activity
android:name=".activity.PrimaryBrowser"
android:label="@string/title_activity_primary_browser"
android:screenOrientation="landscape" />
<activity android:name=".PlaybackActivity" />
<activity android:name=".BrowseErrorActivity" />
<activity
android:name=".activity.MainActivity"
android:banner="@drawable/app_icon_your_company"
android:icon="@drawable/app_icon_your_company"
android:label="@string/app_name"
android:logo="@drawable/app_icon_your_company"
android:screenOrientation="landscape">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LEANBACK_LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".DetailsActivity" />
</application>
</manifest>
Примечание: я тестировал его в эмуляторе с клавиатурой, а не с D-pad