以编程方式更改边距并不按预期工作

时间:2014-03-26 02:44:45

标签: android android-layout android-view

我有一个GUI,其中innerLayout的最初边距为0,10,0,100,我的意图hideinfoarea()应删除infoLayout并更改0, 10,0,10中的边距showInfoarea()应恢复初始边距并再次显示infoLayout。

不幸的是,当我设置这些边距时,一些布局没有很好地显示,例如标题太靠近mainLayout,当我重新启用它时,infoLayout将覆盖一段图像。 尽管在布局编辑器的测试中,边距是完美的。

当我调用showInfoarea()时为什么布局边距没有恢复到原始条件,如果我只是反转hideInfoarea()的操作?

这是我的代码

 RelativeLayout mainLayout;
    LinearLayout innerLayout;

    public void hideInfoarea(){
        mainLayout = (RelativeLayout) findViewById(R.id.mainContainer);
        innerLayout = (LinearLayout) findViewById(R.id.innerLayout);
        mainContainer.removeView(infoLayout);

        //adjust margins
        RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) innerLayout.getLayoutParams();  
        params.setMargins(0, 10, 0, 10);
        innerLayout.setLayoutParams(params);
    }

public void showInfoarea(){
        mainLayout = (RelativeLayout) findViewById(R.id.mainContainer);
        innerLayout = (LinearLayout) findViewById(R.id.innerLayout);
        mainContainer.addView(infoLayout);

        //adjust margins
        RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) innerLayout.getLayoutParams();  
        params.setMargins(0, 10, 0, 100);
        innerLayout.setLayoutParams(params);
    }

这里是XML

   <!-- The main content view -->
    <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=".MainActivity"
            android:padding="5dp"
            android:gravity="fill_horizontal|fill_vertical"
            android:background="@color/Platinum"
            android:id="@+id/mainLayout">

        <TextView
                android:id="@+id/txtTitle"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentTop="true"
                android:layout_centerHorizontal="true"
                android:text="Sample"
                android:textSize="12dp"
                android:layout_marginBottom="10dp"/>

        <LinearLayout
                android:orientation="vertical"
                android:layout_width="match_parent"
                android:layout_height="fill_parent"
                android:id="@+id/innerlayout"
                android:layout_marginTop="10dp"
                android:layout_marginBottom="100dp">

            <ImageView
                    android:layout_width="wrap_content"
                    android:layout_height="fill_parent"
                    android:id="@+id/imageView"
                    android:scaleType="fitXY"
                    android:src="@drawable/rectangle"
                    android:layout_marginBottom="100dp"
                    android:layout_marginTop="10dp"/>
        </LinearLayout>

        <LinearLayout
                android:layout_width="400dp"
                android:layout_height="100dp"
                android:layout_alignParentBottom="true"
                android:background="@drawable/background_label_mm"
                android:layout_centerHorizontal="true"
                android:orientation="vertical"
                android:id="@+id/infoLayout"
                android:layout_margin="5dp">

        </LinearLayout>

    </RelativeLayout>


    <!-- The navigation drawer -->

    <ListView
            android:id="@+id/drawer"
            android:layout_width="320dp"
            android:layout_height="match_parent"
            android:layout_gravity="start"
            android:background="#F3F3F4"
            android:choiceMode="singleChoice"
            android:divider="@android:color/transparent"
            android:dividerHeight="0dp"/>

</android.support.v4.widget.DrawerLayout>

1 个答案:

答案 0 :(得分:1)

请注意,因为您可以使用Reference setMargins(int left, int top, int right, int bottom)方法使用px并使用dp布局。您必须进行如下转换:

// where "dp" is your value dip
int px = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 
                 (float) dp, getResources().getDisplayMetrics());  
// then set your margins
params.setMargins(0, px, 0, px);  

请参阅此答案:What is the correct way to specify dimensions in DIP from Java code?,反之亦然:Converting pixels to dp

另外,你可以阅读另一篇参考文献:

  

设置边距(以像素为单位)。 需要调用requestLayout(),以便考虑新的边距。

希望这有帮助。