所以我最近开始使用片段并试图了解一切是如何工作的。我把它放在一起,但我的应用程序一直在崩溃。任何有关正在发生的事情的提示都将受到高度赞赏,同时也解释为什么它也会很棒。我试图在一个片段中加载一个youtube视频,该片段加载在一个由listview适配器传递给我的视图中。这是我的设置:
我为youtube视频设置了一个片段:
public class PlayerYouTubeFrag extends YouTubePlayerSupportFragment {
private String currentVideoID = "Adp1TUDRNtc";
private YouTubePlayer activePlayer;
public static PlayerYouTubeFrag newInstance(String url) {
PlayerYouTubeFrag playerYouTubeFrag = new PlayerYouTubeFrag();
Bundle bundle = new Bundle();
bundle.putString("url", url);
playerYouTubeFrag.setArguments(bundle);
return playerYouTubeFrag;
}
private void init() {
initialize("AIzaSyCQxLWF1j0XFwKmros9w4Y5XSk1hqpEg6Q", new OnInitializedListener() {
@Override
public void onInitializationFailure(Provider arg0, YouTubeInitializationResult arg1) { }
@Override
public void onInitializationSuccess(YouTubePlayer.Provider provider, YouTubePlayer player, boolean wasRestored) {
activePlayer = player;
activePlayer.setPlayerStyle(YouTubePlayer.PlayerStyle.DEFAULT);
if (!wasRestored) {
activePlayer.loadVideo(getArguments().getString("url"), 0);
}
}
});
}
}
现在我还有一个设置片段和交换的类:
public class Youtube extends FragmentActivity{
public static final String API_KEY = "MyKey";
public static final String VIDEO_ID = "videoID";
public YouTubePlayerView youTubePlayerView;
public Youtube(View view) {
//issue here!!!
PlayerYouTubeFrag myFragment = PlayerYouTubeFrag.newInstance("Adp1TUDRNtc");
getSupportFragmentManager().beginTransaction().replace(view.findViewById(R.id.placeholder).getId(), myFragment).commit();
}
最后但并非最不重要的是我的xml:
<FrameLayout
android:id="@+id/placeholder"
android:layout_height="match_parent"
android:layout_width="match_parent">
</FrameLayout>
logcat:
05-01 15:40:42.439: E/AndroidRuntime(24550): FATAL EXCEPTION: main
05-01 15:40:42.439: E/AndroidRuntime(24550): Process: com.elmehalawi.hamra, PID: 24550
05-01 15:40:42.439: E/AndroidRuntime(24550): java.lang.IllegalStateException: Activity has been destroyed
05-01 15:40:42.439: E/AndroidRuntime(24550): at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1365)
05-01 15:40:42.439: E/AndroidRuntime(24550): at and roid.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:595)
05-01 15:40:42.439: E/AndroidRuntime(24550): at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:574)
05-01 15:40:42.439: E/AndroidRuntime(24550): at com.elmehalawi.hamra.cards.Youtube.<init>(Youtube.java:31)
05-01 15:40:42.439: E/AndroidRuntime(24550): at com.elmehalawi.hamra.cards.YoutubeCard.setupInnerViewElements(YoutubeCard.java:23)
05-01 15:40:42.439: E/AndroidRuntime(24550): at it.gmariotti.cardslib.library.internal.Card.getInnerView(Card.java:250)
05-01 15:40:42.439: E/AndroidRuntime(24550): at it.gmariotti.cardslib.library.view.CardView.setupMainView(CardView.java:364)
05-01 15:40:42.439: E/AndroidRuntime(24550): at it.gmariotti.cardslib.library.view.CardView.buildUI(CardView.java:270)
05-01 15:40:42.439: E/AndroidRuntime(24550): at it.gmariotti.cardslib.library.view.CardView.setCard(CardView.java:230)
05-01 15:40:42.439: E/AndroidRuntime(24550): at com.elmehalawi.hamra.FeedAdapter.getView(FeedAdapter.java:96)
05-01 15:40:42.439: E/AndroidRuntime(24550): at android.widget.AbsListView.obtainView(AbsListView.java:2263)
05-01 15:40:42.439: E/AndroidRuntime(24550): at android.widget.ListView.measureHeightOfChildren(ListView.java:1263)
05-01 15:40:42.439: E/AndroidRuntime(24550): at android.widget.ListView.onMeasure(ListView.java:1175)
05-01 15:40:42.439: E/AndroidRuntime(24550): at android.view.View.measure(View.java:16497)
05-01 15:40:42.439: E/AndroidRuntime(24550): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125)
答案 0 :(得分:3)
您不应该在Fragment
的构造函数中进行任何初始化(尤其不是Activity
事务)。初始化应该在onCreate
public class Youtube extends FragmentActivity {
public static final String API_KEY = "MyKey";
public static final String VIDEO_ID = "videoID";
public YouTubePlayerView youTubePlayerView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
PlayerYouTubeFrag myFragment = PlayerYouTubeFrag.newInstance("Adp1TUDRNtc");
getSupportFragmentManager().beginTransaction().replace(view.findViewById(R.id.placeholder).getId(), myFragment).commit();
}
}
答案 1 :(得分:1)
只需替换onCreate() method of your activity
中的片段即可。也不要像现在创建的那样创建任何构造函数。
在Activities onCreate() method
中写下您制作片段和替换的代码。
另外,只需传递你正在使用的FrameLayout的id。
PlayerYouTubeFrag myFragment = PlayerYouTubeFrag.newInstance("Adp1TUDRNtc");
getSupportFragmentManager().beginTransaction().replace(R.id.placeholder, myFragment).commit();
答案 2 :(得分:0)
您拥有Youtube extends FragmentActivity
,并且您在new
中使用setupInnerViewElements()
对该活动进行了实例化。永远不要使用new
实例化活动。如果您需要实例化活动,请使用Intent
。
此外,您不能拥有带参数的活动构造函数 - 框架需要查找并调用no-arg构造函数。它通常是隐含的,即您根本不定义构造函数。将您的活动设置代码放在onCreate()
。