- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试创建一个类似于 Youtube 应用的 View ,如下所示:
点击我将打开一个对话框,如下所示:
是否有任何已经由 android 构建的 View 或库可以帮助我创建它,还是我需要自己创建它?
我试着搜索它,但找不到任何东西。
最佳答案
尝试这种我已经成功使用的方式
示例代码
MainActivity
public class MainActivity extends AppCompatActivity {
RelativeLayout myRelativeLayout;
TextView tvText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myRelativeLayout = findViewById(R.id.myRelativeLayout);
tvText = findViewById(R.id.tvText);
myRelativeLayout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
showCustomDialog();
}
});
}
private void showCustomDialog() {
final Dialog myDialog = new Dialog(this);
myDialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
RecyclerView myRecyclerView;
DataAdapter dataAdapter;
ArrayList<DataModel> arrayList = new ArrayList<>();
Button btnCancel;
// setting custom layout in out dialog
myDialog.setContentView(R.layout.custom_dialog_layout);
// findViewById for views inside dialog
myRecyclerView = myDialog.findViewById(R.id.MyRecyclerView);
btnCancel = myDialog.findViewById(R.id.btnCancel);
// programatically setting hight and witdh of dialog
Window window = myDialog.getWindow();
window.setLayout(WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.WRAP_CONTENT);
// setting gravity of dialog so it will diaply in the center of screen
window.setGravity(Gravity.CENTER);
// setting TRANSPARENT Background to myDialog to display myDialog with rounded corner
myDialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
// adding data in to arrayList
arrayList.add(new DataModel("Very Small", false));
arrayList.add(new DataModel("Small", false));
arrayList.add(new DataModel("Normal", true));
arrayList.add(new DataModel("Large", true));
arrayList.add(new DataModel("Very Large", true));
// using DataAdapter.OnItemClickListener() getting result which item is selected in recyclerview
dataAdapter = new DataAdapter(this, arrayList, new DataAdapter.OnItemClickListener() {
@Override
public void onItemClick(DataModel item, int position) {
// setting result in a textview when user select recyclerview item
tvText.setText(item.getName());
}
});
// setting LayoutManager in myRecyclerView
myRecyclerView.setLayoutManager(new LinearLayoutManager(this));
// setting Adapter( in myRecyclerView
myRecyclerView.setAdapter(dataAdapter);
// click listner for btnCancel to dismiss myDialog
btnCancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
myDialog.dismiss();
}
});
// used for display Dialog
myDialog.show();
}
}
layout.activity_main
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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">
<RelativeLayout
android:id="@+id/myRelativeLayout"
android:layout_width="match_parent"
android:padding="5dp"
android:layout_height="wrap_content"
android:gravity="center">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_centerInParent="true"
android:padding="5dp"
android:text="Language"
android:textColor="@android:color/black" />
<TextView
android:id="@+id/tvText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_centerInParent="true"
android:drawableEnd="@drawable/ic_arrow"
android:gravity="center"
tools:text="Deafult" />
</RelativeLayout>
</LinearLayout>
layout.custom_dialog_layout
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:cardCornerRadius="20dp"
app:cardElevation="5dp"
app:cardUseCompatPadding="true">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:layout_marginBottom="10dp"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:padding="10dp"
android:text="Text Size"
android:textColor="@android:color/black"
android:textSize="20sp" />
<View
android:layout_width="match_parent"
android:layout_height="2dp"
android:layout_marginTop="5dp"
android:background="@android:color/darker_gray" />
<android.support.v7.widget.RecyclerView
android:id="@+id/MyRecyclerView"
android:layout_width="match_parent"
android:layout_height="270dp" />
<Button
android:id="@+id/btnCancel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginTop="10dp"
android:background="@drawable/round_button"
android:paddingStart="50dp"
android:paddingEnd="50dp"
android:text="Cancel"
android:textColor="#00b7ff" />
</LinearLayout>
</android.support.v7.widget.CardView>
DataAdapter
public class DataAdapter extends RecyclerView.Adapter<DataAdapter.ViewHolder> {
private Context context;
private ArrayList<DataModel> arrayList = new ArrayList<>();
private final OnItemClickListener listener;
public DataAdapter(Context context, ArrayList<DataModel> arrayList, OnItemClickListener listener) {
this.context = context;
this.arrayList = arrayList;
this.listener = listener;
}
private int lastCheckedPosition = -1;
@NonNull
@Override
public DataAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View view = LayoutInflater.from(context).inflate(R.layout.custom_row_item, viewGroup, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull DataAdapter.ViewHolder viewHolder, int position) {
// here i'm changing the state of radio button based on user select
viewHolder.radioImage.setChecked(position == lastCheckedPosition);
viewHolder.tvTextName.setText(arrayList.get(position).getName());
// this is condition is used to hide line from thr last recyclerview item
if (position == arrayList.size()-1) {
viewHolder.bottomLine.setVisibility(View.GONE);
} else {
viewHolder.bottomLine.setVisibility(View.VISIBLE);
}
}
public interface OnItemClickListener {
void onItemClick(DataModel item, int position);
}
@Override
public int getItemCount() {
return arrayList.size();
}
public class ViewHolder extends RecyclerView.ViewHolder {
View bottomLine;
RadioButton radioImage;
TextView tvTextName;
public ViewHolder(@NonNull View itemView) {
super(itemView);
bottomLine = itemView.findViewById(R.id.bottomLine);
radioImage = itemView.findViewById(R.id.radioImage);
tvTextName = itemView.findViewById(R.id.tvTextName);
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
arrayList.get(getAdapterPosition()).setSelected(true);
lastCheckedPosition = getAdapterPosition();
// getting result when user selecte radio button in your activity
listener.onItemClick(arrayList.get(lastCheckedPosition), lastCheckedPosition);
notifyDataSetChanged();
}
});
}
}
}
layout.custom_row_item
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="10dp"
android:layout_marginTop="10dp"
android:layout_marginEnd="10dp">
<TextView
android:id="@+id/tvTextName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_centerInParent="true"
android:padding="5dp"
android:textColor="@android:color/black"
tools:text="TextName" />
<RadioButton
android:id="@+id/radioImage"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_centerInParent="true"
android:src="@drawable/ic__unchecked_radio_button" />
<View
android:id="@+id/bottomLine"
android:layout_width="match_parent"
android:layout_height="1dp"
android:layout_below="@id/tvTextName"
android:layout_marginTop="10dp"
android:background="@android:color/darker_gray" />
</RelativeLayout>
ic__unchecked_radio_button.xml
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
android:fillColor="#FF000000"
android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM12,20c-4.42,0 -8,-3.58 -8,-8s3.58,-8 8,-8 8,3.58 8,8 -3.58,8 -8,8z"/>
</vector>
ic_checked_radio_button.xml
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
android:fillColor="#FF000000"
android:pathData="M12,7c-2.76,0 -5,2.24 -5,5s2.24,5 5,5 5,-2.24 5,-5 -2.24,-5 -5,-5zM12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM12,20c-4.42,0 -8,-3.58 -8,-8s3.58,-8 8,-8 8,3.58 8,8 -3.58,8 -8,8z"/>
</vector>
round_button.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:padding="10dp"
android:shape="rectangle">
<!-- this one is ths color of the Rounded Button -->
<solid android:color="#476e6e6e" />
<!-- this one is used to set radius of the Rounded Button -->
<corners android:radius="50dp" />
</shape>
OUTPUT
请查看此视频(以上代码的输出)https://www.youtube.com/watch?v=hGf-30Oh8OM
Screen-Shots
NOTE
您还可以使用 PopupWindow
实现这一点
这里有一些不错的文章
关于android - 创建带有选项列表的弹出窗口,例如 Youtube App,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53133151/
是否有任何解决方案来禁用右键单击选项并从 Youtube 视频中删除右下角水印 Logo ?我在搜索 GOOGLE 后尝试过。谁能告诉我? 谢谢你。 最佳答案 试试 modestbranding范围:
我想使用 YouTube API (v3) 来启用仅音乐轨道的搜索(没有猫或藤蔓或任何其他非音乐视频)。我查看了 API Explorer 和文档以获取有关该问题的任何指示,但找不到任何有用的信息。
我需要为网站使用YouTube视频缩略图的maxresdefault版本,但是在开发实现此目的的代码后,我发现并非所有视频都具有这些缩略图,尽管这些视频均为1080p。 有没有一种方法可以自动为我的所
我想通过“iframe”嵌入youtube视频,但YouTube在我国禁止使用,建议我如何在我的网站上嵌入视频! [1]:以下图片显示了在我的国家/地区无法访问youtube 最佳答案 该视频将被嵌入
我正在为myBB使用一个名为Profile Music Plugin的插件,可以在此处找到http://community.mybb.com/mods.php?action=view&pid=75 我
Youtube IFRAME API中是否有可以执行命令的功能,例如在播放的视频结尾处打开网站? (我相信有一个功能可以在旧的Java API下执行此操作,但该功能已于去年弃用。) 最佳答案 您可以引
我试图在Videos.insert和Videos.update查询中设置3d尺寸标志。但是标志不会改变。 更新查询示例: 请求: PUT https://www.googleapis.com/yout
使用此获取评论 评论主题:列表 GET https://www.googleapis.com/youtube/v3/commentThreads?part=snippet { "error": {
最近,我尝试使用OEmbed服务通过播放列表查询参数获取视频网址的iframe代码,但是OEmbed为我们提供了与我要求的视频不同的iframe代码。 这是带有播放列表查询参数的视频网址: https
我正在使用此代码: https://www.googleapis.com/youtube/v3/search?q=global+warming&part=id&maxResults=50&key=MY
我有一个LiveBroadcast,并且将来会添加一个scheduledStartTime。据我所知,这次测试不会对LiveBroadcast的整体状态产生影响,即广播是否具有准备就绪/测试的life
YouTube API是否支持在特定时间后关闭浏览器的参数? 这需要使用链接在不同位置共享来推广促销视频。视频播放结束后关闭浏览器。 最佳答案 您可以使用Youtube API监控视频是否播放完毕,然
如果没有表单上的透明面板,YouTube Player将可以正常播放视频,或者可以全屏播放视频,透明面板中有一些图像没有什么特别的。如果我取出透明面板,则YouTube播放器会按需工作,并嵌入到应用程
我正在通过Google进行身份验证,以尝试获取YouTube分析数据,但我的问题是我不知道在查询YouTube时如何向您填充参数 在这里,我正在提供一项新服务:然后尝试查询它 我不确定要在“ids”参
我想添加youtube视频列表,但不添加视频播放器。所以我需要的是 视频标题 视频缩略图 视频时长 我以某种方式设法通过使用此http://img.youtube.com/vi/4wew2uWoARw
我正在使用youtube api和python库gdata 我遵循了文档,但似乎没有出路。 问题是 - How do i get the size of the youtube video fil
使用Youtube API,我如何获得评论或顶过youtube视频的用户ID /处理列表? 提前致谢 最佳答案 在这里,您可以了解如何使用YouTube API v2(v3尚不支持此注释)获取评论:h
我正在为所有相关数据构建一个仪表板(以php为单位),我还想在YouTube“稍后观看”播放列表中显示我的商品数量。 我知道无法使用YouTube API来解决这个问题,但是也许有人想出一种解决方法?
我尝试使用YouTube API,但存在引号问题。 SearchResource.ListRequest searchListRequest = yt.Search.List("sni
我想为我的Android应用程序的用户构建视频推荐器。我有Google OAuth可以登录我的应用程序。我可以获取有关我的应用程序用户在YouTube上观看的视频的数据吗? 最佳答案 v3 API分为
我是一名优秀的程序员,十分优秀!