YouTube Android API:YouTubePlayerFragment 加载微调器
YouTube Android API: YouTubePlayerFragment loading spinner
我正在使用 Android YouTube API 示例在我的应用程序中创建无边框 YouTube 播放器。我遇到一个问题,即缓冲/加载进度条继续显示在我的视频上,即使它已加载并开始播放。我可以在 FragmentDemoActivity
示例中通过一些小的修改来重现它:
public class FragmentDemoActivity extends AppCompatActivity implements YouTubePlayer.OnInitializedListener {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.fragments_demo);
YouTubePlayerFragment youTubePlayerFragment =
(YouTubePlayerFragment) getFragmentManager().findFragmentById(R.id.youtube_fragment);
youTubePlayerFragment.initialize(DeveloperKey.DEVELOPER_KEY, this);
}
@Override
public void onInitializationSuccess(YouTubePlayer.Provider provider, YouTubePlayer player,
boolean wasRestored) {
if (!wasRestored) {
player.setPlayerStyle(YouTubePlayer.PlayerStyle.CHROMELESS);
player.loadVideo("nCgQDjiotG0", 10);
}
}
@Override
public void onInitializationFailure(YouTubePlayer.Provider provider, YouTubeInitializationResult youTubeInitializationResult) {}
}
我已经将 FragmentDemoActivity
更改为继承自 AppCompatActivity
而不是 YouTubeFailureRecoveryActivity
,正如文档所说的那样。我还在 onInitializationSuccess
中将播放器样式更改为无边框。最后,我把cueVideo
改成了loadVideo
,就是为了触发自动播放。
包括 Nexus 5X 在内的多台设备都会出现这种情况。我正在使用库版本 1.2.2。 onInitializationFailure
.
中没有触发错误
视频缓冲后开始播放。播放器是无铬的。然而,缓冲微调器永远不会消失。这是一个错误,还是我在做一些我不允许做的事情?
我也遇到了,确实是bug。这是我设法解决它的方法。
在您的 onInitializationSuccess
中,在 player
上设置一个 PlaybackEventListener
。覆盖 onBuffering
并执行如下操作:
ViewGroup ytView = (ViewGroup)ytPlayerFragment.getView();
ProgressBar progressBar;
try {
// As of 2016-02-16, the ProgressBar is at position 0 -> 3 -> 2 in the view tree of the Youtube Player Fragment
ViewGroup child1 = (ViewGroup)ytView.getChildAt(0);
ViewGroup child2 = (ViewGroup)child1.getChildAt(3);
progressBar = (ProgressBar)child2.getChildAt(2);
} catch (Throwable t) {
// As its position may change, we fallback to looking for it
progressBar = findProgressBar(ytView);
// TODO I recommend reporting this problem so that you can update the code in the try branch: direct access is more efficient than searching for it
}
int visibility = isBuffering ? View.VISIBLE : View.INVISIBLE;
if (progressBar != null) {
progressBar.setVisibility(visibility);
// Note that you could store the ProgressBar instance somewhere from here, and use that later instead of accessing it again.
}
findProgressBar
方法,用作后备以防 YouTube 代码更改:
private ProgressBar findProgressBar(View view) {
if (view instanceof ProgressBar) {
return (ProgressBar)view;
} else if (view instanceof ViewGroup) {
ViewGroup viewGroup = (ViewGroup)view;
for (int i = 0; i < viewGroup.getChildCount(); i++) {
ProgressBar res = findProgressBar(viewGroup.getChildAt(i));
if (res != null) return res;
}
}
return null;
}
这个解决方案对我来说工作得很好,当播放器正在缓冲时启用 ProgressBar
并在不缓冲时禁用它。
编辑: 如果使用此解决方案的任何人发现此错误已修复或 ProgressBar
的位置已更改,请分享以便我可以编辑我的回答,谢谢!
我正在使用 Android YouTube API 示例在我的应用程序中创建无边框 YouTube 播放器。我遇到一个问题,即缓冲/加载进度条继续显示在我的视频上,即使它已加载并开始播放。我可以在 FragmentDemoActivity
示例中通过一些小的修改来重现它:
public class FragmentDemoActivity extends AppCompatActivity implements YouTubePlayer.OnInitializedListener {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.fragments_demo);
YouTubePlayerFragment youTubePlayerFragment =
(YouTubePlayerFragment) getFragmentManager().findFragmentById(R.id.youtube_fragment);
youTubePlayerFragment.initialize(DeveloperKey.DEVELOPER_KEY, this);
}
@Override
public void onInitializationSuccess(YouTubePlayer.Provider provider, YouTubePlayer player,
boolean wasRestored) {
if (!wasRestored) {
player.setPlayerStyle(YouTubePlayer.PlayerStyle.CHROMELESS);
player.loadVideo("nCgQDjiotG0", 10);
}
}
@Override
public void onInitializationFailure(YouTubePlayer.Provider provider, YouTubeInitializationResult youTubeInitializationResult) {}
}
我已经将 FragmentDemoActivity
更改为继承自 AppCompatActivity
而不是 YouTubeFailureRecoveryActivity
,正如文档所说的那样。我还在 onInitializationSuccess
中将播放器样式更改为无边框。最后,我把cueVideo
改成了loadVideo
,就是为了触发自动播放。
包括 Nexus 5X 在内的多台设备都会出现这种情况。我正在使用库版本 1.2.2。 onInitializationFailure
.
视频缓冲后开始播放。播放器是无铬的。然而,缓冲微调器永远不会消失。这是一个错误,还是我在做一些我不允许做的事情?
我也遇到了,确实是bug。这是我设法解决它的方法。
在您的 onInitializationSuccess
中,在 player
上设置一个 PlaybackEventListener
。覆盖 onBuffering
并执行如下操作:
ViewGroup ytView = (ViewGroup)ytPlayerFragment.getView();
ProgressBar progressBar;
try {
// As of 2016-02-16, the ProgressBar is at position 0 -> 3 -> 2 in the view tree of the Youtube Player Fragment
ViewGroup child1 = (ViewGroup)ytView.getChildAt(0);
ViewGroup child2 = (ViewGroup)child1.getChildAt(3);
progressBar = (ProgressBar)child2.getChildAt(2);
} catch (Throwable t) {
// As its position may change, we fallback to looking for it
progressBar = findProgressBar(ytView);
// TODO I recommend reporting this problem so that you can update the code in the try branch: direct access is more efficient than searching for it
}
int visibility = isBuffering ? View.VISIBLE : View.INVISIBLE;
if (progressBar != null) {
progressBar.setVisibility(visibility);
// Note that you could store the ProgressBar instance somewhere from here, and use that later instead of accessing it again.
}
findProgressBar
方法,用作后备以防 YouTube 代码更改:
private ProgressBar findProgressBar(View view) {
if (view instanceof ProgressBar) {
return (ProgressBar)view;
} else if (view instanceof ViewGroup) {
ViewGroup viewGroup = (ViewGroup)view;
for (int i = 0; i < viewGroup.getChildCount(); i++) {
ProgressBar res = findProgressBar(viewGroup.getChildAt(i));
if (res != null) return res;
}
}
return null;
}
这个解决方案对我来说工作得很好,当播放器正在缓冲时启用 ProgressBar
并在不缓冲时禁用它。
编辑: 如果使用此解决方案的任何人发现此错误已修复或 ProgressBar
的位置已更改,请分享以便我可以编辑我的回答,谢谢!