我在将子视图集中在Android上的父视图中时花了很多时间(免责声明:我是一位iOS开发人员,对Android经验很少)。我想要的非常简单:将不确定的进度视图(旋转器)置于Web视图父级的内部。
Web视图是Fragment的一部分,在Android Studio中的布局如下:
如您所见,它正在使用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用于相对于其父项放置子视图,因此我不确定为什么这不起作用。这是我所看到的(微调器显示在左上方):
如何使微调器居中?
答案 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>