您如何在Android的父视图中将子视图居中?

时间:2018-06-21 01:11:37

标签: android android-relativelayout

我在将子视图集中在Android上的父视图中时花了很多时间(免责声明:我是一位iOS开发人员,对Android经验很少)。我想要的非常简单:将不确定的进度视图(旋转器)置于Web视图父级的内部。

Web视图是Fragment的一部分,在Android Studio中的布局如下:

WebView layout

如您所见,它正在使用RelativeLayout。另外,这是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"
android:gravity="center"
tools:context=".WrappedWebViewFragment">

    <WebView
        android:id="@+id/fragment_web_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_centerInParent="true" >

    </WebView>
</RelativeLayout>

在Fragment类中,我实例化微调器并尝试将其居中:

public void onStart() {
    super.onStart();

    WebView webView = getView().findViewById(R.id.fragment_web_view);
    ProgressBar spinner = new ProgressBar(getActivity());
    RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(100, 100);
    layoutParams.addRule(RelativeLayout.CENTER_IN_PARENT);
    webView.addView(spinner, layoutParams);
    ...
}

据我了解,RelativeLayout用于相对于其父项放置子视图,因此我不确定为什么这不起作用。这是我所看到的(微调器显示在左上方):

enter image description here

如何使微调器居中?

2 个答案:

答案 0 :(得分:1)

WebView扩展了AbsoluteLayout。因此,addRule中的RelativeLayout.LayoutParams不适用。另外,由于webview是absoluteLayout,因此将视图添加到webview似乎不是一个好主意。 由于AbsoluteLayout不支持gravity属性,因此必须直接计算center的x和y值。最好在布局文件中编写代码以查看Web视图并在加载Web视图时取消进度。

如果您仍然希望将其直接放置在Web视图中,则可以尝试以下方法。 (这似乎不是一个好方法)

public class MyWebView extends WebView {
    private boolean isFirstLayout = true;

    public MyWebView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    protected void onFinishInflate() {
        super.onFinishInflate();
        Button v = new Button(getContext());
        v.setText("test");
        AbsoluteLayout.LayoutParams lp = new AbsoluteLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, 0, 0);
        v.setLayoutParams(lp);
        addView(v);
    }

    @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
        super.onLayout(changed, l, t, r, b);
        if (isFirstLayout) {
            View v = getChildAt(0);
            AbsoluteLayout.LayoutParams lp = (LayoutParams) v.getLayoutParams();
            lp.x = (getWidth() / 2) - (v.getWidth() / 2);
            lp.y = (getHeight() / 2) - (v.getHeight() / 2);
            v.setLayoutParams(lp);
            isFirstLayout = false;
        }
    }

}

答案 1 :(得分:0)

为什么不在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=".WrappedWebViewFragment">

    <WebView
        android:id="@+id/fragment_web_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

     <ProgressBar
        android:id="@+id/progressBar"
        style="?android:attr/progressBarStyleHorizontal"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:layout_centerHorizontal="true"
        android:indeterminate="true"
        android:max="100"
        android:minHeight="50dp"
        android:minWidth="200dp"
        android:progress="1" />

</RelativeLayout>