2013-07-14 8 views
0

Это заставляет меня полностью орехами, в основном у меня есть RelativeLayout с ImageView и LinearLayout внутри. Я хочу, чтобы LinearLayout была шириной ImageView, высота была постоянным значением и располагалась в нижней части ImageView (Overlapping the bottom).Изменение размеров вида с другого вида

Что на самом деле происходит (я полагаю, я мог ошибаться): по какой-то причине на первом проходе размеры ImageView являются параметрами исходного изображения (или, как я полагаю), который изменяет размер RelativeLayout, а затем, когда ImageView измененный в соответствии с границами, он не обновляет родительский RelativeLayout или детей.

Я переопределил каждый из просмотров, попробовал называть их разными способами и до сих пор не повезло.

Вот вид:

<?xml version="1.0" encoding="utf-8"?> 
<uk.co.testing.prototype.prototype.views.RelativeLayoutExtended 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:background="#FFF" 
    android:paddingLeft="5dip"> 

    <uk.co.testing.prototype.prototype.views.FixedImageView 
    android:id="@+id/image" 
    android:layout_width="wrap_content" 
    android:layout_height="fill_parent" 
    android:adjustViewBounds="true" /> 

    <uk.co.testing.prototype.prototype.views.LinearLayoutExtended 
     android:id="@+id/width_wrapper" 
     android:background="@drawable/image_gradient" 
     android:layout_width="fill_parent" 
     android:layout_height="30dip" 
     android:layout_alignParentBottom="true" 
     android:orientation="vertical"> 

    </uk.co.testing.prototype.prototype.views.LinearLayoutExtended> 

</uk.co.testing.prototype.views.RelativeLayoutExtended> 

Это мой RelativeLayoutExtended:

import android.content.Context; 
import android.util.AttributeSet; 
import android.util.Log; 
import android.widget.ImageView; 
import android.widget.RelativeLayout; 

public class RelativeLayoutExtended extends RelativeLayout 
{ 
    public RelativeLayoutExtended(Context context) 
    { 
     super(context); 
    } 

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

    public RelativeLayoutExtended(Context context, AttributeSet attrs, int defStyle) 
    { 
     super(context, attrs, defStyle); 
    } 

    @Override 
    public void onSizeChanged(int w, int h, int oldw, int oldh) 
    { 
     //int heightDensity = (int) (50 * (getResources().getDisplayMetrics().density + 0.5f)); 
     //LinearLayoutExtended linearLayout = (LinearLayoutExtended) getChildAt(1); 
     //linearLayout.setLayoutParams(new RelativeLayout.LayoutParams(getWidth(), getHeight())); 

     //ImageView imageView = (ImageView) getChildAt(0); 

     //Log.e("width", "" + imageView.getWidth()); 
     //Log.e("height", "" + imageView.getHeight()); 

     super.onSizeChanged(w, h, oldw, oldh); 
    } 

} 

Это мой LinearLayoutExtended:

import android.content.Context; 
import android.util.AttributeSet; 
import android.util.Log; 
import android.view.ViewGroup; 
import android.widget.LinearLayout; 

public class LinearLayoutExtended extends LinearLayout 
{ 
    public LinearLayoutExtended(Context context) 
    { 
     super(context); 
    } 

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

    @Override 
    public void setLayoutParams(ViewGroup.LayoutParams params) 
    { 
     super.setLayoutParams(params); 
/* 

     Log.e("set", "width " + params.width); 
     Log.e("set", "height " + params.height); 
     // WHY U NO RESIZE? 
     post(new Runnable() 
     { 
      @Override 
      public void run() 
      { 
       requestLayout(); 
       Log.e("get", "width " + getWidth()); 
       Log.e("get", "height " + getHeight()); 
      } 
     });*/ 
    } 


    @Override 
    public void onSizeChanged(int w, int h, int oldw, int oldh) 
    { 
     super.onSizeChanged(w, h, oldw, oldh); 
    } 
} 

Это мой FixedImageView:

import android.R.color; 
import android.content.Context; 
import android.util.AttributeSet; 
import android.util.Log; 
import android.view.View; 
import android.view.ViewGroup; 
import android.view.ViewGroup.LayoutParams; 
import android.widget.ImageView; 
import android.widget.LinearLayout; 
import android.widget.RelativeLayout; 

public class FixedImageView extends ImageView 
{ 

    public FixedImageView(Context context) 
    { 
     super(context); 
    } 

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

    public FixedImageView(Context context, AttributeSet attrs, int defStyle) 
    { 
     super(context, attrs, defStyle); 
    } 

    @Override 
    public void requestLayout() 
    { 
     super.requestLayout(); 
    } 

    private RelativeLayout relativeLayout = null; 
    private LinearLayout linearLayout = null; 

    @Override 
    public void onSizeChanged(int w, int h, int oldw, int oldh) 
    { 
     //Log.e("onSizeChanged", "width:" + w); // 660 
     //Log.e("onSizeChanged", "height:" + h); // 550 

     //int heightDensity = (int) (50 * (getResources().getDisplayMetrics().density + 0.5f)); 
     //LinearLayoutExtended linearLayout = (LinearLayoutExtended) getChildAt(1); 
     //linearLayout.setLayoutParams(new RelativeLayout.LayoutParams(getWidth(), getHeight())); 

     //ImageView imageView = (ImageView) getChildAt(0); 

     //Log.e("width", "" + imageView.getWidth()); 
     //Log.e("height", "" + imageView.getHeight()); 

     super.onSizeChanged(w, h, oldw, oldh); 

     //RelativeLayout relativeLayout = (RelativeLayout)this.getParent(); 
     //LinearLayout linearLayout = (LinearLayout)relativeLayout.getChildAt(1); 
     //linearLayout.invalidate(); 

     relativeLayout = (RelativeLayout)this.getParent(); 


     linearLayout = (LinearLayout)relativeLayout.getChildAt(1); 

     linearLayout.post(new Runnable() 
     { 
      @Override 
      public void run() 
      { 
       RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(getWidth(), getHeight()); 
       layoutParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM); 

       linearLayout.setLayoutParams(layoutParams); 
       linearLayout.invalidate(); 
       linearLayout.requestLayout(); 
      } 
     }); 

     relativeLayout.post(new Runnable() 
     { 
      @Override 
      public void run() 
      { 
       RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(getWidth(), getHeight()); 

       relativeLayout.setLayoutParams(layoutParams); 
       relativeLayout.invalidate(); 
       relativeLayout.requestLayout(); 
      } 
     }); 

     /* 
     RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT); 
     layoutParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM); 

     RelativeLayout relativeLayout = (RelativeLayout)this.getParent(); 

     LinearLayoutExtended linearLayoutExtended = new LinearLayoutExtended(this.getContext()); 
     linearLayoutExtended.setBackgroundColor(color.black); 
     //linearLayoutExtended.setBackgroundDrawable(getResources().getDrawable(R.drawable.image_gradient)); 
     linearLayoutExtended.setLayoutParams(layoutParams); 
     linearLayoutExtended.setOrientation(LinearLayout.VERTICAL); 

     relativeLayout.addView(linearLayoutExtended); 

     Log.e("width", "" + linearLayoutExtended.getWidth()); // 0 
     Log.e("height", "" + linearLayoutExtended.getHeight()); // 0 
     */ 
    } 

} 

Как вы можете видеть, я пробовал всемогущее количество повторной калибровки (экспериментально пытаясь заставить LinearLayoutExtended и RelativeLayoutExtended быть того же размера, что и FixedImageView), но без везения. :(

Любые предложения, было бы удивительно

Благодаря

Edit:

Сырая пример того, что происходит:

+0

вы на самом деле нужно использовать пользовательские просмотра, кроме неспособности г У и макет? –

+0

Мне не нужны какие-либо пользовательские представления, я экспериментировал с ними, пытаясь понять, почему я не смог изменить размер одного из другого. Я хотел бы знать, почему я не смог этого достичь, но на данный момент я доволен ответом @GabeSechan –

ответ

1

Если вы хотите линейную схему к быть шириной ImageView do:

android:layout_alignLeft=imageviewid 
android:layout_alignRight=imageviewid 

на LinearLayout.

+0

Вы, сэр, гений! И да, это сработало отлично. Извините, у меня нет репутации, чтобы проголосовать за ваш ответ, вместо этого мне понравилась ваша страница на facebook. –

0

Ваш код макета устанавливает ширину ImageView по адресу wrap_content и не содержит информации о местоположении. Поэтому он будет левым верхним в RelativeLayout и будет только таким же широким, как и контент.

Если вы хотите RelativeLayout с двумя View с в ней, оба из которых являются полная ширина, оба они должны быть привязаны к левому и правому краям RelativeLayout либо @Gabe Sechan предлагает или делать это как из них:

android:android:layout_alignParentLeft = "true" 
android:android:layout_alignParentRight = "true" 

для того, чтобы LinearLayout это точно ниже ImageView, вы должны также установить:

android:layout_below="id/image" 
Смежные вопросы