动态添加相对布局到线性布局
Dynamically adding Relative layout into Linear layout
我在 DrawerLayout
中有一个 LinearLayout
,名为 "container"。在 运行 时,我试图在 "container" 中添加一个 RelativeLayout
。它会导致 RelativeLayout
对齐无法正常工作,即徽标图像的进度。
相对布局:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/bg"
android:keepScreenOn="true">
<ImageView
android:id="@+id/logo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:src="@drawable/logo" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/logo"
android:layout_centerHorizontal="true"
android:layout_marginTop="20dp"
android:gravity="center"
android:orientation="vertical"
android:paddingStart="8dp"
android:paddingEnd="5dp">
<ProgressBar
android:id="@+id/progressBar"
style="?android:attr/progressBarStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="1dp"
android:visibility="gone" />
<TextView
android:id="@+id/tv_network_error"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:focusable="false"
android:gravity="center"
android:text="@string/no_network"
android:textColor="#E10000"
android:textSize="30sp"
android:visibility="visible" />
</LinearLayout>
<TextView
android:id="@+id/tv_software_version"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_alignParentBottom="true"
android:layout_gravity="center_horizontal"
android:gravity="center_horizontal"
android:paddingRight="20dp"
android:paddingBottom="20dp"
android:text="Version"
android:textColor="@android:color/darker_gray" />
</RelativeLayout>
DrawerLayout 有容器
<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="false">
<LinearLayout
android:id="@+id/contentPanel"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
</LinearLayout>
<android.support.design.widget.NavigationView
android:id="@+id/nav_view"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="end"
android:background="@color/white"
android:fitsSystemWindows="false"
app:menu="@menu/activity_main_drawer" />
</android.support.v4.widget.DrawerLayout>
在运行时注入布局
protected View getRootView(View view) {
View sliderLayout = LayoutInflater.from(this).inflate(R.layout.slider_layout, null);
LinearLayout layout = (LinearLayout) sliderLayout.findViewById(R.id.contentPanel);
layout.addView(view);
return sliderLayout;
}
我不确定 getRootView()
在您的代码中的哪个位置。如果您澄清,我可以提供更好的解决方案。
但是,我创建了一个带导航抽屉的项目activity,在layout_to_be_added.xml中定义了要动态添加的RelativeLayout,并在MainActivity的onCreate()
中做了如下实验:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
...
final LinearLayout contentPanel = findViewById(R.id.contentPanel);
contentPanel.post(new Runnable() {
@Override
public void run() {
View layoutToBeAdded = LayoutInflater.from(MainActivity.this).inflate(R.layout.layout_to_be_added, null);
contentPanel.addView(layoutToBeAdded);
// contentPanel.invalidate();
}
});
}
这导致了您提到的问题,进度条和文本不在居中徽标下方,如下所示:
.
似乎 null root 导致错误的计算或评估,因此我更新了 inflate()
行如下:
View layoutToBeAdded = LayoutInflater.from(MainActivity.this).inflate(R.layout.layout_to_be_added, contentPanel, false);
这里我们以根目录提供容器,但我们没有将滑块布局附加到它。这样,根仅用于计算正确的 LayoutParams,我们得到如下所示的预期结果:
线下我改了
contentPanel.addView(view);
至
contentPanel.addView(view,LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.MATCH_PARENT);
它对我有用。
我在 DrawerLayout
中有一个 LinearLayout
,名为 "container"。在 运行 时,我试图在 "container" 中添加一个 RelativeLayout
。它会导致 RelativeLayout
对齐无法正常工作,即徽标图像的进度。
相对布局:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/bg"
android:keepScreenOn="true">
<ImageView
android:id="@+id/logo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:src="@drawable/logo" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/logo"
android:layout_centerHorizontal="true"
android:layout_marginTop="20dp"
android:gravity="center"
android:orientation="vertical"
android:paddingStart="8dp"
android:paddingEnd="5dp">
<ProgressBar
android:id="@+id/progressBar"
style="?android:attr/progressBarStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="1dp"
android:visibility="gone" />
<TextView
android:id="@+id/tv_network_error"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:focusable="false"
android:gravity="center"
android:text="@string/no_network"
android:textColor="#E10000"
android:textSize="30sp"
android:visibility="visible" />
</LinearLayout>
<TextView
android:id="@+id/tv_software_version"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_alignParentBottom="true"
android:layout_gravity="center_horizontal"
android:gravity="center_horizontal"
android:paddingRight="20dp"
android:paddingBottom="20dp"
android:text="Version"
android:textColor="@android:color/darker_gray" />
</RelativeLayout>
DrawerLayout 有容器
<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="false">
<LinearLayout
android:id="@+id/contentPanel"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
</LinearLayout>
<android.support.design.widget.NavigationView
android:id="@+id/nav_view"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="end"
android:background="@color/white"
android:fitsSystemWindows="false"
app:menu="@menu/activity_main_drawer" />
</android.support.v4.widget.DrawerLayout>
在运行时注入布局
protected View getRootView(View view) {
View sliderLayout = LayoutInflater.from(this).inflate(R.layout.slider_layout, null);
LinearLayout layout = (LinearLayout) sliderLayout.findViewById(R.id.contentPanel);
layout.addView(view);
return sliderLayout;
}
我不确定 getRootView()
在您的代码中的哪个位置。如果您澄清,我可以提供更好的解决方案。
但是,我创建了一个带导航抽屉的项目activity,在layout_to_be_added.xml中定义了要动态添加的RelativeLayout,并在MainActivity的onCreate()
中做了如下实验:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
...
final LinearLayout contentPanel = findViewById(R.id.contentPanel);
contentPanel.post(new Runnable() {
@Override
public void run() {
View layoutToBeAdded = LayoutInflater.from(MainActivity.this).inflate(R.layout.layout_to_be_added, null);
contentPanel.addView(layoutToBeAdded);
// contentPanel.invalidate();
}
});
}
这导致了您提到的问题,进度条和文本不在居中徽标下方,如下所示:
似乎 null root 导致错误的计算或评估,因此我更新了 inflate()
行如下:
View layoutToBeAdded = LayoutInflater.from(MainActivity.this).inflate(R.layout.layout_to_be_added, contentPanel, false);
这里我们以根目录提供容器,但我们没有将滑块布局附加到它。这样,根仅用于计算正确的 LayoutParams,我们得到如下所示的预期结果:
线下我改了
contentPanel.addView(view);
至
contentPanel.addView(view,LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.MATCH_PARENT);
它对我有用。