Android: как установить ширину / высоту YoutubePlayerSupportFragment

#java #android #android-fragments #layout #youtube

#java #Android #android-фрагменты #макет #YouTube

Вопрос:

Я использую YoutubePlayerSupportFragment в своем приложении. Я создаю фрагмент из кода (не xml) и внедряю его в действие с помощью FragmentManager:

 String video_id = "LHcP4MWABGY";

YoutubeFragment youtubeFragment = YoutubeFragment.newInstance(video_id);

mFragmentManager.beginTransaction().replace(R.id.activity_main, youtubeFragment).commit()
  

Как я могу определить ширину / высоту фрагмента youtube? Я пробовал с:

 ViewGroup.LayoutParams params = (ViewGroup.LayoutParams)youtubeFragment.getView().getLayoutParams();

params.height = 400;

youtubeFragment.getView().setLayoutParams(params);
  

но это дает мне исключение NullPointerException. Исключение находится в этой строке:

 ViewGroup.LayoutParams params = (ViewGroup.LayoutParams)youtubeFragment.getView().getLayoutParams();
  

Это журнал ошибок:

 java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.ViewGroup$LayoutParams android.view.View.getLayoutParams()' on a null object reference
                at com.test.revy.radioshake.MainActivity$1.onItemClick(MainActivity.java:249)
                at android.widget.AdapterView.performItemClick(AdapterView.java:346)
                at android.widget.AbsListView.performItemClick(AbsListView.java:1550)
                at android.widget.AbsListView$PerformClick.run(AbsListView.java:3830)
                at android.widget.AbsListView$3.run(AbsListView.java:5855)
                at android.os.Handler.handleCallback(Handler.java:739)
                at android.os.Handler.dispatchMessage(Handler.java:95)
                at android.os.Looper.loop(Looper.java:148)
                at android.app.ActivityThread.main(ActivityThread.java:7325)
                at java.lang.reflect.Method.invoke(Native Method)
                at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
                at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
  

Комментарии:

1. Опубликуйте свои журналы. Также укажите на строку, в которой возникает исключение.

2. Я добавил журнал

3. Я думаю, что после добавления фрагмента вы не дождались его завершения транзакции, т. Е. youtubeFragment onCreateView() Он еще не был вызван или не был завершен. В любом случае вид не установлен.

4. Поэтому дождитесь обратного вызова, подтверждающего, что транзакция действительно завершена, или переместите свой код изменения размера YoutubeFragment .

5. И если я правильно помню, тогда вам нужно будет установить LayoutParams значение parent из getView() like so getView().getParent() , которое вернет ваш контейнер YoutubeFragment .

Ответ №1:

Как предположил Аббас, проблема заключается в Transaction().[..].commit() FragmentManager (асинхронный вызов). Решаемая с помощью commitNow() вместо commit():

 mFragmentManager.beginTransaction().replace(R.id.activity_main, youtubeFragment).commitNow()
  

Комментарии:

1. Вместо этого вы должны вызвать resize в onCreateView() of YoutubeFragment .