- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在开发一个安卓应用程序。在此应用程序中,我希望使用 AppCompatActivity
在 ListView
或 RecyclerView
中使用 youtube 播放器播放 youtube 视频。我使用了 YouTubeBaseActivity
,它与此配合使用效果很好,但我需要 AppCompatActivity
。所以我使用 YouTubePlayerFragment
或 YouTubePlayerSupportFragment
来解决我的问题。
当我将 YouTubePlayerFragment
与 AppCompatActivity
一起使用时,它运行良好。但是我想在 ListView
中使用它,但出现以下错误。
android.view.InflateException: Binary XML file line #8: Binary XML file line #8: Error inflating class fragment
Caused by: android.view.InflateException: Binary XML file line #8: Error inflating class fragment
Caused by: java.lang.IllegalArgumentException: Binary XML file line #8: Duplicate id 0x7f0b0063, tag null, or parent id 0x7f0b0062 with another fragment for com.google.android.youtube.player.YouTubePlayerFragment
at android.app.FragmentManagerImpl.onCreateView(FragmentManager.java:3611)
at android.app.FragmentController.onCreateView(FragmentController.java:98)
at android.app.Activity.onCreateView(Activity.java:6182)
at android.support.v4.app.BaseFragmentActivityApi14.onCreateView(BaseFragmentActivityApi14.java:41)
at android.support.v4.app.FragmentActivity.onCreateView(FragmentActivity.java:75)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:783)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:733)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:866)
at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:827)
at android.view.LayoutInflater.inflate(LayoutInflater.java:518)
at android.view.LayoutInflater.inflate(LayoutInflater.java:426)
at android.view.LayoutInflater.inflate(LayoutInflater.java:377)
at com.example.youtubecardview.frag_youtube.custom_youtube_list_adapter.getView(custom_youtube_list_adapter.java:63)
at android.widget.AbsListView.obtainView(AbsListView.java:2372)
at android.widget.ListView.measureHeightOfChildren(ListView.java:1408)
at android.widget.ListView.onMeasure(ListView.java:1315)
at android.view.View.measure(View.java:21783)
at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:715)
at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:461)
at android.view.View.measure(View.java:21783)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6549)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
at android.support.v7.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:139)
at android.view.View.measure(View.java:21783)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6549)
at android.support.v7.widget.ActionBarOverlayLayout.onMeasure(ActionBarOverlayLayout.java:391)
at android.view.View.measure(View.java:21783)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6549)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
at android.view.View.measure(View.java:21783)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6549)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1514)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:806)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:685)
at android.view.View.measure(View.java:21783)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6549)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
at com.android.internal.policy.DecorView.onMeasure(DecorView.java:699)
at android.view.View.measure(View.java:21783)
at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2409)
at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1497)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1750)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1385)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6722)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:886)
at android.view.Choreographer.doCallbacks(Choreographer.java:698)
at android.view.Choreographer.doFrame(Choreographer.java:633)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:872)
at android.os.Handler.handleCallback(Handler.java:769)
at android.os.Handler.dispatchMessage(Handler.java:98)
<强>1。 Main2Acitivy.java
public class Main2Activity extends AppCompatActivity {
private ListView mList;
private Context mContext;
private Activity mActivity;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
mContext = this;
mActivity = this;
mList = (ListView) findViewById(R.id.list_view);
List<String> mVideoIDList = new ArrayList<>();
mVideoIDList.add("KSGYVl4ZgRs");
// mVideoIDList.add("nCgQDjiotG0");
// mVideoIDList.add("P3mAtvs5Elc");
mList.setAdapter(new custom_youtube_list_adapter(mContext,mVideoIDList,mActivity));
/**
* @usages
* check YouTubePlayerFragment is working with main activity or not
*
* @status : #Working
*/
/*
YouTubePlayerFragment youtubeFragment = (YouTubePlayerFragment) getFragmentManager().findFragmentById(R.id.youtubeplayerfragment);
youtubeFragment.initialize(YOUTUBE_API_KEY,
new YouTubePlayer.OnInitializedListener() {
@Override
public void onInitializationSuccess(YouTubePlayer.Provider provider,
YouTubePlayer youTubePlayer, boolean b) {
// do any work here to cue video, play video, etc.
youTubePlayer.cueVideo("KSGYVl4ZgRs");
}
@Override
public void onInitializationFailure(YouTubePlayer.Provider provider,
YouTubeInitializationResult youTubeInitializationResult) {
}
});*/
}
}
<强>2。 activity_main2.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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"
tools:context="com.example.youtubecardview.frag_youtube.Main2Activity">
<ListView
android:layout_width="wrap_content"
android:id="@+id/list_view"
android:layout_height="wrap_content">
</ListView>
</RelativeLayout>
<强>3。 custom_youtube_list_adapter.java
public class custom_youtube_list_adapter extends BaseAdapter {
private List<String> aList;
private Context aContext;
private Activity aActivity;
public custom_youtube_list_adapter(Context mContext, List<String> mList, Activity mActivity){
aList = new ArrayList<>();
this.aContext = mContext;
this.aList = mList;
this.aActivity =mActivity;
}
@Override
public int getCount() {
return aList.size();
}
@Override
public String getItem(int i) {
return aList.get(i);
}
@Override
public long getItemId(int i) {
return i;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
mHolder holder;
LayoutInflater inflater = (LayoutInflater) aContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View v;
if (convertView == null) {
v =inflater.from(aContext).inflate(R.layout.custom_frag_youtube_list, null);
//v = inflater.inflate(R.layout.custom_frag_youtube_list, null);
} else {
v = convertView;
}
YouTubePlayerFragment youtubeFragment = (YouTubePlayerFragment) aActivity.getFragmentManager().findFragmentById(R.id.youtubeplayerfragment1);
youtubeFragment.initialize(YOUTUBE_API_KEY,
new YouTubePlayer.OnInitializedListener() {
@Override
public void onInitializationSuccess(YouTubePlayer.Provider provider,
YouTubePlayer youTubePlayer, boolean b) {
// do any work here to cue video, play video, etc.
youTubePlayer.cueVideo(aList.get(position));
}
@Override
public void onInitializationFailure(YouTubePlayer.Provider provider,
YouTubeInitializationResult youTubeInitializationResult) {
}
});
return v;
}
class mHolder {
}
}
<强>4。 custom_frag_youtube_list.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/parent_relativeLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<fragment
android:name="com.google.android.youtube.player.YouTubePlayerFragment"
android:id="@+id/youtubeplayerfragment1"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</RelativeLayout>
所以,请告诉我我哪里错了?如何解决我的问题?
提前致谢。
更新 1:
我正在使用@azizbekian 解决方案。这解决了我的膨胀异常问题,但我有多个布局的相同视频。
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
View view;
YouTubePlayerFragment youtubeFragment;
LayoutInflater inflater = (LayoutInflater) aContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
if (convertView == null) {
View temp = inflater.inflate(R.layout.custom_frag_youtube_list, parent, false);
final int id = View.generateViewId();
temp.setId(id);
youtubeFragment = YouTubePlayerFragment.newInstance();
aActivity.getFragmentManager()
.beginTransaction()
.replace(id, youtubeFragment)
.commit();
view = temp;
view.setTag(youtubeFragment);
} else {
view = convertView;
youtubeFragment = (YouTubePlayerFragment)view.getTag();
}
youtubeFragment.initialize(YOUTUBE_API_KEY,
new YouTubePlayer.OnInitializedListener() {
@Override
public void onInitializationSuccess(YouTubePlayer.Provider provider,
YouTubePlayer youTubePlayer, boolean b) {
// do any work here to cue video, play video, etc.
Log.e("Youtube Position: ",""+position);
Log.e("Youtube list value: ",""+aList.get(position));
youTubePlayer.cueVideo(aList.get(position));
}
@Override
public void onInitializationFailure(YouTubePlayer.Provider provider,
YouTubeInitializationResult youTubeInitializationResult) {
}
});
return view;
}
日志值:
Youtube Position:: 0
Youtube list value:: KSGYVl4ZgRs
Youtube Position:: 1
Youtube list value:: nCgQDjiotG0
更新 2:
我已经解决了所有问题而不是一个问题。如果我在播放一个视频后播放视频,那么时间适配器不会刷新。所以我无法一次处理视频播放。
更新 3:
经过大量搜索和@azizbekian 解决方案后,我已经解决了我的问题。通过使用以下解决方案。
@Override
public View getView(final int position, View convertView, final ViewGroup parent) {
final mHolder holder;
final View fview;
final LayoutInflater inflater = (LayoutInflater) aContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
if (convertView == null) {
holder = new mHolder();
fview = inflater.inflate(R.layout.custom_youtube_frag_listview_list, parent, false);
holder.mLoaderFrame = (ImageView) fview.findViewById(R.id.imgLayer1);
fview.setTag(holder);
} else {
fview = convertView;
holder = (mHolder) fview.getTag();
}
String VideoID = aList.get(position);
/**
* @usages
* https://img.youtube.com/vi/VideoID/0.jpg
*
* where
VideoID is ur youtube video id
YOUTUBE_THUMBNAIL_URL_VIDEO1 = https://img.youtube.com/vi/
YOUTUBE_THUMBNAIL_URL_VIDEO2 = /0.jpg
*/
String mURL = YOUTUBE_THUMBNAIL_URL_VIDEO1 + VideoID + YOUTUBE_THUMBNAIL_URL_VIDEO2;
Glide.with(aContext).load(mURL).into(holder.mLoaderFrame);
holder.mLoaderFrame.setVisibility(View.VISIBLE);
if(mCounterLeaveremove != 0){
int mId = position+1;
if(mCounterLeaveremove != mId){
FragmentManager fragmentManager = aActivity.getFragmentManager();
Fragment oldFragment = null;
try {
oldFragment = fragmentManager.findFragmentById(mId);
} catch (Exception e) {
e.printStackTrace();
}
if(oldFragment != null) {
// Delete fragmet from ui, do not forget commit() otherwise no action
// is going to be observed
fragmentManager.beginTransaction().remove(oldFragment).commit();
}
}
}
holder.mLoaderFrame.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mCounterLeaveremove = position+1;
notifyDataSetChanged();
YouTubePlayerFragment youtubeFragment;
final int id = position+1;
fview.setId(id);
youtubeFragment = YouTubePlayerFragment.newInstance();
aActivity.getFragmentManager()
.beginTransaction()
.replace(id, youtubeFragment)
.commit();
youtubeFragment.initialize(YOUTUBE_API_KEY,
new YouTubePlayer.OnInitializedListener() {
@Override
public void onInitializationSuccess(YouTubePlayer.Provider provider,
YouTubePlayer youTubePlayer, boolean b) {
Log.e("Youtube Position: ", "" + position);
Log.e("Youtube list value: ", "" + aList.get(position));
holder.mLoaderFrame.setVisibility(View.GONE);
String VideoID = aList.get(position);
youTubePlayer.loadVideo(VideoID);
youTubePlayer.setOnFullscreenListener(new YouTubePlayer.OnFullscreenListener() {
@Override
public void onFullscreen(boolean b) {
}
});
youTubePlayer.addFullscreenControlFlag(0);
/**
* @usages
* 1. Listener use for manage video thumbnail and youtube player
*/
new custom_youtube_list_adapter.MyPlayerStateChangeListener(holder.mLoaderFrame);
new custom_youtube_list_adapter.MyPlaybackEventListener(holder.mLoaderFrame);
}
@Override
public void onInitializationFailure(YouTubePlayer.Provider provider,
YouTubeInitializationResult youTubeInitializationResult) {
}
});
}
});
return fview;
}
要获取 youtube 视频缩略图,你可以去 throw。
How do I get a YouTube video thumbnail from the YouTube API?
最佳答案
Caused by: java.lang.IllegalArgumentException: Binary XML file line #8: Duplicate id 0x7f0b0063, tag null, or parent id 0x7f0b0062 with another fragment for com.google.android.youtube.player.YouTubePlayerFragment
问题是,您正试图膨胀具有相同 ID 的多个 fragment ,这是不可能的。因此,不是将 YouTubePlayerFragment
添加到 xml
文件中,而是在 java 代码中创建它。因此,custom_frag_youtube_list.xml
将更改为以下内容:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
然后在你的适配器中:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
...
View view;
YouTubePlayerFragment youtubeFragment;
if (convertView == null) {
View temp = inflater.inflate(R.layout.custom_frag_youtube_list, parent, false);
final int id = View.generateViewId();
temp.setId(id);
youtubeFragment = YouTubePlayerFragment.newInstance();
activity.getFragmentManager()
.beginTransaction()
.replace(id, youtubeFragment)
.commit();
view = temp;
view.setTag(youtubeFragment);
} else {
view = convertView;
youtubeFragment = view.getTag();
}
// interact with youtubeFragment
...
return view;
}
根据 this thread 判断,Google 似乎不允许同时播放多个 YouTube 视频。
关于java - ListView 中的 YouTubePlayerFragment 出现 AppCompatActivity 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45512649/
我的应用程序从一个有 5 个选项卡的选项卡栏 Controller 开始。一开始,第一个出现了它的名字,但其他四个没有名字,直到我点击它们。然后根据用户使用的语言显示名称。如何在选项卡栏出现之前设置选
我有嵌套数组 json 对象(第 1 层、第 2 层和第 3 层)。我的问题是数据表没有出现。任何相关的 CDN 均已导入。该表仅显示部分。我引用了很多网站,但都没有解决我的问题。 之前我使用标准表来
我正在尝试设置要显示的 Parse PFLoginViewController。这是我的一个 View Controller 的类。 import UIKit import Parse import
我遇到了这个问题,我绘制的对象没有出现在 GUI 中。我知道它正在被处理,因为数据被推送到日志文件。但是,图形没有出现。 这是我的一些代码: public static void main(Strin
我有一个树状图,其中包含出现这样的词...... TreeMap occurrence = new TreeMap (); 字符串 = 单词 整数 = 出现次数。 我如何获得最大出现次数 - 整数,
因此,我提示用户输入变量。如果变量小于 0 且大于 10。如果用户输入 10,我想要求用户再次输入数字。我问时间的时候输入4,它说你输入错误。但在第二次尝试时效果很好。例如:如果我输入 25,它会打印
我已经用 css overflow 属性做了一个例子。在这个例子中我遇到了一个溢出滚动的问题。滚动条出现了,但没有工作意味着每当将光标移动到滚动条时,在这个滚动条不活动的时间。我对此一无所知,所以请帮
我现在正在做一个元素。当您单击一个元素时,会出现以下信息,我想知道如何在您单击下一个元素而不重新单击同一元素时使其消失....例如,我的元素中有披萨,我想单击肉披萨看到浇头然后点击奶酪披萨看到浇头和肉
我有一个路由器模块,它将主题与正则表达式进行比较,并将出现的事件与一致的键掩码链接起来。 (它是一个简单的 url 路由过滤,如 symfony http://symfony.com/doc/curr
这个问题在这里已经有了答案: 9年前关闭。 Possible Duplicate: mysql_fetch_array() expects parameter 1 to be resource, bo
我在底部有一个带有工具栏的 View ,我正在使用 NavigationLink 导航到该 View 。但是当 View 出现时,工具栏显示得有点太低了。大约半秒钟后,它突然跳到位。它只会在应用程序启
我试图在我的应用程序上为背景音乐添加一个 AVAudioPlayer,我正在主屏幕上启动播放器,尝试在应用程序打开时开始播放但出现意外行为... 它播放并立即不断创建新玩家并播放这些玩家,因此同时播放
这是获取一个数字,获取其阶乘并将其加倍,但是由于基本情况,如果您输入 0,它会给出 2 作为答案,因此为了绕过它,我使用了 if 语句,但收到错误输入“if”时解析错误。如果你们能提供帮助,我真的很感
暂停期间抛出异常 android.os.DeadObjectException 在 android.os.BinderProxy.transactNative( native 方法) 在 androi
我已经为猜词游戏编写了一些代码。它从用户输入中读取字符并在单词中搜索该字符;根据字符是否在单词中,程序返回并控制一些变量。 代码如下: import java.util.Random; import
我是自动化领域的新手。这是我的简单 TestNG 登录代码,当我以 TestNG 身份运行该代码时,它会出现 java.lang.NullPointerException,双击它会突出显示我导航到 U
我是c#程序员,我习惯了c#的封装语法和其他东西。但是现在,由于某些原因,我应该用java写一些东西,我现在正在练习java一天!我要创建一个为我自己创建一个虚拟项目,以便让自己更熟悉 Java 的
我正在使用 Intellij,我的源类是 main.com.coding,我的资源文件是 main.com.testing。我将 spring.xml 文件放入资源文件中。 我的测试类位于 test.
我想要我的tests folder separate到我的应用程序代码。我的项目结构是这样的 myproject/ myproject/ myproject.py moduleon
这个问题已经有答案了: What is a NullPointerException, and how do I fix it? (12 个回答) 已关闭 6 年前。 因此,我尝试比较 2 个值,一个
我是一名优秀的程序员,十分优秀!