将 Fragment 中的视图与父 AppCompatActivity 中的视图对齐
Align View in Fragment to View in parent AppCompatActivity
我正在尝试使用 getLayoutParams()
将片段中的视图与其父视图中的视图对齐 AppCompatActivity
RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) viewImAligning.getLayoutParams();
params.addRule(RelativeLayout.BELOW, R.id.video_view_from_appCompat);
viewImAligning.setLayoutParams(params);
我正确地在片段上初始化 R.id.video_view_from_appCompat
,因为我可以从片段的 setUserVisibleHint
方法中获取它的 width/height 等。
但是,无论我将 viewImAligning.setLayoutParams(params);
放在片段生命周期的哪个位置,我都无法让 viewImAligning
与 video_view_from_appCompat
对齐
目前我使用的是一种变通方法 getLocationsOnScreen
int [] generatedLocations = new int[2];
locations = generatedLocations;
videoViewFromAppCompat.getLocationOnScreen(locations);
int x = locations[0];
int y = locations[1];
viewImAligning.setY(y);
虽然 hacky 解决方法可以解决问题,但我想了解为什么我没有让 getLayoutParams 工作。
编辑:代码和 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);
我想我明白了。您正在尝试将作为 Fragment
(R.id.view_im_aligning
) 的基本视图的视图与属于您的 [=15] 的 RelativeLayout
内的视图 (R.id.video_view_from_appCompat
) 对齐=].问题是它们不共享同一个父级,这就是导致您的代码失败的原因。
我建议如下 - 如果您需要一个专用片段显示在您的 video_view_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>
我正在尝试使用 getLayoutParams()
将片段中的视图与其父视图中的视图对齐 AppCompatActivity
RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) viewImAligning.getLayoutParams();
params.addRule(RelativeLayout.BELOW, R.id.video_view_from_appCompat);
viewImAligning.setLayoutParams(params);
我正确地在片段上初始化 R.id.video_view_from_appCompat
,因为我可以从片段的 setUserVisibleHint
方法中获取它的 width/height 等。
但是,无论我将 viewImAligning.setLayoutParams(params);
viewImAligning
与 video_view_from_appCompat
对齐
目前我使用的是一种变通方法 getLocationsOnScreen
int [] generatedLocations = new int[2];
locations = generatedLocations;
videoViewFromAppCompat.getLocationOnScreen(locations);
int x = locations[0];
int y = locations[1];
viewImAligning.setY(y);
虽然 hacky 解决方法可以解决问题,但我想了解为什么我没有让 getLayoutParams 工作。
编辑:代码和 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);
我想我明白了。您正在尝试将作为 Fragment
(R.id.view_im_aligning
) 的基本视图的视图与属于您的 [=15] 的 RelativeLayout
内的视图 (R.id.video_view_from_appCompat
) 对齐=].问题是它们不共享同一个父级,这就是导致您的代码失败的原因。
我建议如下 - 如果您需要一个专用片段显示在您的 video_view_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>