从Visibility GONE设置Visibility Visible后,未获取RelativeLayout设置Height()

时间:2013-01-30 06:21:23

标签: android android-layout android-custom-view

我想要的是,当我点击仪表板按钮时,它会像SlidingDrawer一样打开,再次点击它打开后它会关闭。 我使用这个自定义抽屉,因为SlidingDrawer已弃用。

现在的问题是,它的工作正常,除了我第一次点击按钮时它会在没有任何动画的情况下快速打开,但正常关闭,之后工作正常。

我发现问题是当我使RelativeLayout可见并尝试计算其getHeight()时,它最初会给出零,然后给出适当的高度。

这是LogCat:

enter image description here 这是我的XML文件。

 <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/relLayOne"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:background="#0000" >

    <Button
        android:id="@+id/btnNEWCLICK"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:background="@drawable/dashboard" />

    <RelativeLayout
        android:id="@+id/relLayTwo"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/btnNEWCLICK"
        android:background="#000"
        android:visibility="gone" >

        <Button
            android:id="@+id/loc"
            android:layout_width="130dp"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:layout_marginBottom="5dp"
            android:layout_marginLeft="10dp"
            android:layout_marginRight="5dp"
            android:layout_marginTop="5dp"
            android:background="#000"
            android:gravity="left|center_vertical"
            android:paddingLeft="5dp"
            android:text="My Location"
            android:textColor="#fff"
            android:textSize="20sp" />

        <View
            android:layout_width="0.1dp"
            android:layout_height="108dp"
            android:layout_centerInParent="true"
            android:layout_marginBottom="15dp"
            android:layout_marginTop="15dp"
            android:background="#fff" />

        <Button
            android:id="@+id/phot"
            android:layout_width="130dp"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:layout_marginBottom="5dp"
            android:layout_marginLeft="5dp"
            android:layout_marginRight="10dp"
            android:layout_marginTop="5dp"
            android:background="#000"
            android:gravity="left|center_vertical"
            android:paddingLeft="5dp"
            android:text="Photos"
            android:textColor="#fff"
            android:textSize="20sp" />

        <View
            android:layout_width="fill_parent"
            android:layout_height="0.1dp"
            android:layout_below="@+id/phot"
            android:layout_marginLeft="10dp"
            android:layout_marginRight="10dp"
            android:background="#fff" />

        <Button
            android:id="@+id/free"
            android:layout_width="130dp"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:layout_below="@+id/loc"
            android:layout_marginBottom="5dp"
            android:layout_marginLeft="10dp"
            android:layout_marginRight="5dp"
            android:layout_marginTop="5dp"
            android:background="#000"
            android:gravity="left|center_vertical"
            android:paddingLeft="5dp"
            android:text="Free stuff"
            android:textColor="#fff"
            android:textSize="20sp" />

        <Button
            android:id="@+id/leade"
            android:layout_width="130dp"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:layout_below="@+id/phot"
            android:layout_marginBottom="5dp"
            android:layout_marginLeft="5dp"
            android:layout_marginRight="10dp"
            android:layout_marginTop="5dp"
            android:background="#000"
            android:gravity="left|center_vertical"
            android:paddingLeft="5dp"
            android:text="Leaderboard"
            android:textColor="#fff"
            android:textSize="20sp" />

        <View
            android:layout_width="fill_parent"
            android:layout_height="0.1dp"
            android:layout_below="@+id/leade"
            android:layout_marginLeft="10dp"
            android:layout_marginRight="10dp"
            android:background="#fff" />

        <Button
            android:id="@+id/live"
            android:layout_width="130dp"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:layout_below="@+id/free"
            android:layout_marginBottom="5dp"
            android:layout_marginLeft="10dp"
            android:layout_marginRight="5dp"
            android:layout_marginTop="5dp"
            android:background="#000"
            android:gravity="left|center_vertical"
            android:paddingLeft="5dp"
            android:text="Live Action"
            android:textColor="#fff"
            android:textSize="20sp" />

        <Button
            android:id="@+id/home"
            android:layout_width="130dp"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:layout_below="@+id/leade"
            android:layout_marginBottom="5dp"
            android:layout_marginLeft="5dp"
            android:layout_marginRight="10dp"
            android:layout_marginTop="5dp"
            android:background="#000"
            android:gravity="left|center_vertical"
            android:paddingLeft="5dp"
            android:text="Home"
            android:textColor="#fff"
            android:textSize="20sp" />

        <View
            android:layout_width="fill_parent"
            android:layout_height="0.1dp"
            android:layout_below="@+id/home"
            android:layout_marginLeft="10dp"
            android:layout_marginRight="10dp"
            android:background="#fff" />

        <Button
            android:id="@+id/app"
            android:layout_width="130dp"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:layout_below="@+id/live"
            android:layout_marginBottom="5dp"
            android:layout_marginLeft="10dp"
            android:layout_marginRight="5dp"
            android:layout_marginTop="5dp"
            android:background="#000"
            android:gravity="left|center_vertical"
            android:paddingLeft="5dp"
            android:text="App stats"
            android:textColor="#fff"
            android:textSize="20sp" />
    </RelativeLayout>

</RelativeLayout>

这是The Code ::

public class MoveView extends LinearLayout{
     private Button openCloseButton;
     private boolean isVisible = false;
     private RelativeLayout relLayTwo, relLayOne;
     private float animationHeight = 300.0f;

    public MoveView(Context context , AttributeSet attr) {
        super(context, attr);
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        inflater.inflate(R.layout.in, this);

        relLayTwo = (RelativeLayout) findViewById(R.id.relLayTwo);
        //relLayOne = (RelativeLayout) findViewById(R.id.relLayOne);
        openCloseButton = (Button) findViewById(R.id.btnNEWCLICK);

        openCloseButton.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                toggle();
            }
        });

        Log.d("test", "before "+relLayTwo.getHeight());
        if (relLayTwo.getHeight() == 0){
            relLayTwo.setVisibility(View.VISIBLE);
            relLayTwo.invalidate();
            relLayTwo.refreshDrawableState();
            //rel.setVisibility(View.INVISIBLE);
            relLayTwo.setVisibility(View.GONE);
            Log.d("test", "after "+relLayTwo.getHeight());
        }

    }



    public void toggle() {
        TranslateAnimation anim = null;
        isVisible = !isVisible;

        if (isVisible) {
            relLayTwo.setVisibility(View.VISIBLE);
            anim = new TranslateAnimation(0.0f, 0.0f, relLayTwo.getHeight(), 0.0f);
            Log.d("test", " rel Height "+relLayTwo.getHeight());
        } else {
            Log.d("test", " rel Height else "+relLayTwo.getHeight() );
            anim = new TranslateAnimation(0.0f, 0.0f, 0.0f, relLayTwo.getHeight());
            anim.setAnimationListener(collapseListener);
        }

        anim.setDuration(600);
        anim.setInterpolator(new AccelerateInterpolator(1.0f));
        startAnimation(anim);
    }

    Animation.AnimationListener collapseListener = new Animation.AnimationListener() {
        public void onAnimationEnd(Animation animation) {
            relLayTwo.setVisibility(View.GONE);
        }

        public void onAnimationRepeat(Animation animation) {
            // not needed
        }

        public void onAnimationStart(Animation animation) {
            // not needed
        }
    };
}

使用onMeasure()方法。

@
Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        // TODO Auto-generated method stub
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        Log.d("test", " RelativeLAyout In onMeaseure "+relLayTwo.getHeight() );

    }

enter image description here

enter image description here

enter image description here

4 个答案:

答案 0 :(得分:1)

首次创建视图时,在调用onMeasure()之前,它的宽度和高度都不可用。因此,第一次尝试获取值时,尚未分配它们。

由于您使用的是自定义View,因此解决方案非常简单。只需将获取高度和宽度的代码移动到onMeasure()中,然后再使用它。

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);

    width = getWidth(); // Get View Width
    height = getHeight();// Get View Height
} 

答案 1 :(得分:1)

以下是我如何解决这个问题。

当我们设置它来包装内容时获取布局高度的实际问题是,它将不会给出高度,直到它实际绘制在屏幕上。在我的情况下,首先调用自定义布局然后它将调用剩余的布局,因此布局无法获得绘制。

所以我所做的是通过使用以下代码获得屏幕运行时间的实际高度和宽度。

DisplayMetrics metrics = new DisplayMetrics();
        ((WindowManager) context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getMetrics(metrics);
        height  =   metrics.heightPixels;
        width   =   metrics.widthPixels; 

在我获得屏幕高度和宽度后,充气视图。 之后获得线性布局高度并使用以下代码为其添加新高度。

RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) relLayTwo.getLayoutParams();
    Log.d("test", "height "+params.height);
    params.height = height*40/100;
    relLayTwo.setLayoutParams(params);
    relLayTwo.setVisibility(View.GONE);

它的工作!!

答案 2 :(得分:1)

只需使用此功能即可获得heightwidth,其可见性为GONE。

myView.getMeasuredHeight();
myView.getMeasuredWidth();

答案 3 :(得分:0)

<RelativeLayout
        android:id="@+id/relLayTwo"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/btnNEWCLICK"
        android:background="#000"
        android:visibility="gone" > //don't put gone in xml

在OnViewCreated中查找高度,然后将此视图设为GONE

@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
         relLayTwo = (RelativeLayout) findViewById(R.id.relLayTwo);
         mHeight = relLayTwo.getHeight();
         relLayTwo.setVisibility(View.GONE);}

通过这种方式,您将获得高度,因为在onViewCreated上已经绘制了视图,并且在您拥有所需内容后,使视图为GONE。