0

Im пытается использовать getLayoutParams() для выравнивания представления в виде фрагмента к представлению в ее материнском AppCompatActivityAlign Просмотр в фрагменте для просмотра в родительском AppCompatActivity

RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) viewImAligning.getLayoutParams(); 
     params.addRule(RelativeLayout.BELOW, R.id.video_view_from_appCompat); 
     viewImAligning.setLayoutParams(params); 

Im инициализирующий R.id.video_view_from_appCompat на фрагменте правильно, так как я могу получить его ширину/высоту и т. д. из метода Фрагмента setUserVisibleHint. Однако я не могу получить viewImAligning чтобы выровнять к video_view_from_appCompat независимо от того, где в жизненном цикле фрагмента I место viewImAligning.setLayoutParams(params);

На данный момент я использую Hacky обходного путь, используя getLocationsOnScreen

 int [] generatedLocations = new int[2]; 
     locations = generatedLocations; 

     videoViewFromAppCompat.getLocationOnScreen(locations); 
     int x = locations[0]; 
     int y = locations[1]; 
     viewImAligning.setY(y); 

Хотя Hacky обходного путь делает трюк , Я хотел бы узнать, почему Im не получает getLayoutParams для работы.

Edit: код и XML (немного запутанного кода включены AsyncTask упаковывают, что было что-то делать с этим

public abstract class VideoIntro extends AppCompatActivity{ 

private LinearLayout videoViewFromAppCompat; 

@Override 
final protected void onCreate(Bundle savedInstanceState) { 
    requestWindowFeature(Window.FEATURE_NO_TITLE); 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.video_intro_layout_test); 
    new LoadContestTask().execute(); 

} 

private class LoadContestTask extends AsyncTask<Object, Object, Object> { 
    ProgressDialog pDialog; 

    @Override 
    protected void onPreExecute() { 
    ... 

    } 

    @Override 
    protected Object doInBackground(Object... params) { 
     initialize(); 
     return true; 
    } 

    protected void onPostExecute(Object result) { 
     loadContent(); 
     pDialog.dismiss(); 
    } 
} 

    private void initialize() { 
    ... 
    videoViewFromAppCompat = (LinearLayout) findViewById(video_view_from_appCompat); 
} 
... 
} 

XML для video_intro_layout_test

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
> 
<SurfaceView 
    android:layout_width="0px" 
    android:layout_height="0px" /> 
<LinearLayout 
    android:id="@+id/video_view_from_appCompat" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_below="@+id/top" 
    android:paddingLeft="45dp" 
    android:paddingRight="45dp" 
    android:paddingTop="36dp" 
    android:visibility="invisible"> 
<VideoView 
    android:id="@+id/video" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    /> 
</LinearLayout> 

<com.my_test.app.CustomViewPager 
    android:id="@+id/view_pager" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content"> 
</com.my_test.app.CustomViewPager> 

фрагмента Кодекса

@Override 
public void onCreate(@Nullable Bundle savedInstanceState) { 
    videoViewFromAppCompat = (LinearLayout) getActivity().findViewById(R.id.video_view_from_appCompat); 

} 

@Override 
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
    View v = inflater.inflate(R.layout.fragment_layout, container, false); 
    viewImAligning = (RelativeLayout) v.findViewById(R.id.view_im_aligning); 

} 

@Override 
public void setUserVisibleHint(boolean isVisibleToUser) { 
    super.setUserVisibleHint(isVisibleToUser); 
    if (isVisibleToUser) 
    RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) viewImAligning.getLayoutParams(); 
    params.addRule(RelativeLayout.BELOW, R.id.video_view_from_appCompat); 
    viewImAligning.setLayoutParams(params); 
+0

Можете ли вы поделиться XML или код, в котором можно определить и добавить viewImAligning по отношению к другим взглядам и особенно его родителей? –

+0

Отправьте свой XML-код и код активности. – xaxist

+0

@ DoronYakovlev-Golani Обновленный вопрос с кодом - спасибо – user1446988

ответ

1

Я думаю, что понял. Вы пытаетесь выровнять представление h - вид основания Fragment (R.id.view_im_aligning) на вид (R.id.video_view_from_appCompat) внутри RelativeLayout, который принадлежит вашему Activity. Проблема в том, что они не разделяют одного и того же родителя, и это то, что приводит к сбою вашего кода.

Я предлагаю следующее - если вам нужен выделенный фрагмент под вашим видео_вью_from_appCompat, добавьте FrameLayout, чтобы добавить фрагмент, чтобы добавить фрагмент в этот вид. После этого вы можете выровнять FrameLayout ниже video_view_from_appCompat.

Так что ваш XML будет выглядеть примерно так:

<RelativeLayout ...> 
    ... 
    <LinearLayout 
     android:id="@+id/video_view_from_appCompat" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_below="@+id/top" 
     android:paddingLeft="45dp" 
     android:paddingRight="45dp" 
     android:paddingTop="36dp" 
     android:visibility="invisible"> 
    <FrameLayout 
     android:id="@+id/fragment_container" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_below="@+id/video_view_from_appCompat"/> 
    ... 
</RelativeLayout> 
+0

После тщательной настройки вашего ответа я провел в правильном направлении. Я разместил свой «CustomViewPager», который содержит динамические фрагменты внутри 'fragment_container', и он работает. Большое спасибо за время. – user1446988