2017-08-06 68 views
1

我正在創建一個應用程序,應該顯示在YouTube片段使用YouTube API的YouTube視頻。我需要使用YouTubePlayerSupportFragment,因爲我無法將我的課程擴展到YouTubeBaseActivity(因爲我已經擴展到AppCompatActivity)。 在這裏看到的錯誤我得到沒有發現ID ....的片段YouTubePlayerSupportFragment片段,它關閉我的應用程序

AndroidRuntime: java.lang.IllegalArgumentException: No view found for id 0x7f0f00a5 (com.[].[]:id/youtube_player) for fragment YouTubePlayerSupportFragment{d4c0c78 #4 id=0x7f0f00a5} 

,我需要展現片段

import android.graphics.Color; 
import android.graphics.drawable.ColorDrawable; 
import android.os.Bundle; 
import android.support.annotation.Nullable; 
import android.support.v4.app.DialogFragment; 
import android.support.v4.app.Fragment; 
import android.view.Gravity; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.view.Window; 
import android.widget.TextView; 

import com.google.android.youtube.player.YouTubePlayerSupportFragment; 
import com.google.android.youtube.player.YouTubePlayerView; 

public class CharityPopup extends DialogFragment { 

    private YouTubePlayerView youTubeView; 

    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) { 
     getDialog().getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); 
     getDialog().getWindow().setDimAmount(0.0f); 
     getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE); 
     getDialog().setCanceledOnTouchOutside(true); 
     View v = inflater.inflate(R.layout.charity_popup, container, false); 


     Fragment fragment = YouTubePlayerSupportFragment.newInstance(); 
     getFragmentManager().beginTransaction().replace(R.id.youtube_player,fragment).commit(); 


     return v; 
    } 


    @Override 
    public void onResume() { 
     super.onResume(); 
     Window window = getDialog().getWindow(); 
     window.setLayout(1000, 1000); 
     window.setGravity(Gravity.CENTER); 
    } 

} 

相應的XML:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" 
    android:id="@+id/charity_popup"> 

    <fragment  android:name="com.google.android.youtube.player.YouTubePlayerSupportFragment" 
     android:id="@+id/youtube_player" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"/> 
</LinearLayout> 

我的YouTube類

import android.app.Activity; 
import android.content.Intent; 
import android.os.Bundle; 
import android.widget.Toast; 

import com.google.android.youtube.player.YouTubeInitializationResult; 
import com.google.android.youtube.player.YouTubePlayer; 
import com.google.android.youtube.player.YouTubePlayerSupportFragment; 
import com.google.android.youtube.player.YouTubePlayerView; 


public class YouTubeVideoFragment extends YouTubePlayerSupportFragment implements YouTubePlayer.OnInitializedListener { 

    private static final int RECOVERY_REQUEST = 1; 
    private YouTubePlayerView youTubeView; 


    public static YouTubeVideoFragment newInstance() { 
     YouTubeVideoFragment fragment = new YouTubeVideoFragment(); 
     return fragment; 
    } 

    private void init(){ 
     initialize("AIzaSyCq543mRV_C5bxdcMxxkXN8U-_bacu8I-Y", this); 
    } 

    public YouTubeVideoFragment() { 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
    } 

    @Override 
    public void onAttach(Activity activity) { 
     super.onAttach(activity); 
    } 

    @Override 
    public void onDetach() { 
     super.onDetach(); 
    } 

    @Override 
    public void onInitializationSuccess(YouTubePlayer.Provider provider, YouTubePlayer youTubePlayer, boolean b) { 
     if (!b) { 
      youTubePlayer.cueVideo("fhWaJi1Hsfo"); // Plays https://www.youtube.com/watch?v=fhWaJi1Hsfo 
     } 

    } 

    @Override 
    public void onInitializationFailure(YouTubePlayer.Provider provider, YouTubeInitializationResult youTubeInitializationResult) { 
     if (youTubeInitializationResult.isUserRecoverableError()) { 
      youTubeInitializationResult.getErrorDialog(getActivity(), RECOVERY_REQUEST).show(); 
     } else { 
      String error = String.format(getString(R.string.player_error), youTubeInitializationResult.toString()); 
      Toast.makeText(getContext(), error, Toast.LENGTH_LONG).show(); 
     } 
    } 

    @Override 
    public void onActivityResult(int requestCode, int resultCode, Intent data) { 
     if (requestCode == RECOVERY_REQUEST) { 
      // Retry initialization if user performed a recovery action 
      getYouTubePlayerProvider().initialize(Config.YOUTUBE_API_KEY, this); 
     } 
    } 

    protected YouTubePlayer.Provider getYouTubePlayerProvider() { 
     return youTubeView; 
    } 

} 

和我的YouTube XML

<?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="match_parent" 
    tools:context=".YouTubeVideoFragment"> 

    <com.google.android.youtube.player.YouTubePlayerView 
     android:id="@+id/youtube_view" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content"/> 

</RelativeLayout> 
+0

確保您對應的xml文件名是'charity_popup'。如果是,則檢查'charity_popup.xml'是否位於名爲'layout'的文件夾中或其他名爲'layout-large'的文件夾中,等等,也就是說您不會忘記處理多個屏幕大小。 – Abbas

+0

基於此[頁面](https://stackoverflow.com/questions/7508044/),請確保您已正確指定'FragmentActivity'的'onCreate()'方法的'setContentView()'中的佈局, 。這個[error](https://stackoverflow.com/a/18146302/5832311)在嵌套Fragments **並且使用getSupportFragmentManager()而不是getChildFragmentManager()來添加時也會發生。這是另一個[SO帖子](https://stackoverflow.com/questions/28556277/java-lang-illegalargumentexception-no-view-found-for-id-0x7f090047-project-na)以供參考。 – abielita

回答

0

在什麼固定我的問題到底是:更好地理解嵌套片段(youtube.com/watch?v=V4kcdvzF5cY),也是極爲重要的和2答案如何工作與YouTubePlayerSupportFragment。這是救了我的鏈接:Struggling with Youtube Player Support Fragment。尋找來自CzarMatt的答案和來自Silmarilos的更正。對於我的xml代碼片段將被替換爲youtube片段:使用FrameLayout & android:name =「com.google.android.youtube.player.YouTubePlaye rSupportFragment」。注意我放在那裏... SupportFragment,這是因爲我使用YouTubePlayerSupportFragment。如果你使用YouTubePlayerFragment,那麼你必須在你的FrameLayout中放入:android:name =「com.google.android.youtube.player.YouTubePlaye rFragment」。