ViewGroup에서 최대 너비 설정
ViewGroup의 최대 너비는 어떻게 설정합니까? 나는 Theme.Dialog
활동을 사용하고 있지만 더 큰 화면으로 크기를 조정할 때 그렇게 좋아 보이지 않으며 일종의 가볍고 전체 화면을 차지하고 싶지 않습니다.
나는 노력 이 제안 아무 소용합니다. 또한 android:maxWidth
일부 뷰와 같은 속성 이 없습니다 .
루트 LinearLayout을 제한하여 (예를 들어) 640 딥이되도록 제한하는 방법이 있습니까? 이를 위해 다른 ViewGroup으로 변경할 의향이 있습니다.
어떤 제안?
내가 한 한 가지 옵션은 LinearLayout을 확장하고 onMeasure 함수를 재정의하는 것입니다. 예를 들면 :
public class BoundedLinearLayout extends LinearLayout {
private final int mBoundedWidth;
private final int mBoundedHeight;
public BoundedLinearLayout(Context context) {
super(context);
mBoundedWidth = 0;
mBoundedHeight = 0;
}
public BoundedLinearLayout(Context context, AttributeSet attrs) {
super(context, attrs);
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.BoundedView);
mBoundedWidth = a.getDimensionPixelSize(R.styleable.BoundedView_bounded_width, 0);
mBoundedHeight = a.getDimensionPixelSize(R.styleable.BoundedView_bounded_height, 0);
a.recycle();
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
// Adjust width as necessary
int measuredWidth = MeasureSpec.getSize(widthMeasureSpec);
if(mBoundedWidth > 0 && mBoundedWidth < measuredWidth) {
int measureMode = MeasureSpec.getMode(widthMeasureSpec);
widthMeasureSpec = MeasureSpec.makeMeasureSpec(mBoundedWidth, measureMode);
}
// Adjust height as necessary
int measuredHeight = MeasureSpec.getSize(heightMeasureSpec);
if(mBoundedHeight > 0 && mBoundedHeight < measuredHeight) {
int measureMode = MeasureSpec.getMode(heightMeasureSpec);
heightMeasureSpec = MeasureSpec.makeMeasureSpec(mBoundedHeight, measureMode);
}
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
}
그런 다음 XML은 사용자 정의 클래스를 사용합니다.
<com.yourpackage.BoundedLinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
app:bounded_width="900dp">
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
</com.youpackage.BoundedLinearLayout>
그리고 attr.xml 파일 항목
<declare-styleable name="BoundedView">
<attr name="bounded_width" format="dimension" />
<attr name="bounded_height" format="dimension" />
</declare-styleable>
편집 : 이것은 내가 지금 사용하고있는 실제 코드입니다. 아직 완전하지는 않지만 대부분의 경우 작동합니다.
Dori의 대답에 대한 더 나은 코드가 있습니다.
메서드 onMeasure
에서 메서드 에서 먼저 호출 super.onMeasure(widthMeasureSpec, heightMeasureSpec);
하면 레이아웃의 모든 개체 너비가 변경되지 않습니다. 레이아웃 (부모) 너비를 설정하기 전에 초기화 되었기 때문입니다.
public class MaxWidthLinearLayout extends LinearLayout {
private final int mMaxWidth;
public MaxWidthLinearLayout(Context context) {
super(context);
mMaxWidth = 0;
}
public MaxWidthLinearLayout(Context context, AttributeSet attrs) {
super(context, attrs);
TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.MaxWidthLinearLayout);
mMaxWidth = a.getDimensionPixelSize(R.styleable.MaxWidthLinearLayout_maxWidth, Integer.MAX_VALUE);
a.recycle();
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int measuredWidth = MeasureSpec.getSize(widthMeasureSpec);
if (mMaxWidth > 0 && mMaxWidth < measuredWidth) {
int measureMode = MeasureSpec.getMode(widthMeasureSpec);
widthMeasureSpec = MeasureSpec.makeMeasureSpec(mMaxWidth, measureMode);
}
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
}
다음은 xml 속성 사용에 대한 링크입니다.
http://kevindion.com/2011/01/custom-xml-attributes-for-android-widgets/
이 질문과 답변에 감사드립니다. 귀하의 답변은 저에게 많은 도움이되었으며 앞으로 다른 사람에게도 도움이되기를 바랍니다.
Chase의 원래 답변 (+1) 위에 빌드하면 몇 가지 변경 사항이 있습니다 (아래에 설명되어 있음).
사용자 지정 속성 (코드 아래 xml)을 통해 최대 너비를 설정했습니다.
I would call
super.measure()
first and then do theMath.min(*)
comparison. Using the original answers code we may encounter problems when the incoming size set in theMeasureSpec
is eitherLayoutParams.WRAP_CONTENT
orLayoutParams.FILL_PARENT
. As these valid constants have values of -2 and -1 respectivly, the originalMath.min(*)
becomes useless as it will preserve these vales over the max size, and say the measuredWRAP_CONTENT
is bigger than our max size this check would not catch it. I imagine the OP was thinking of exact dims only (for which it works great)public class MaxWidthLinearLayout extends LinearLayout { private int mMaxWidth = Integer.MAX_VALUE; public MaxWidthLinearLayout(Context context) { super(context); } public MaxWidthLinearLayout(Context context, AttributeSet attrs) { super(context, attrs); TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.MaxWidthLinearLayout); mMaxWidth = a.getDimensionPixelSize(R.styleable.MaxWidthLinearLayout_maxWidth, Integer.MAX_VALUE); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); //get measured height if(getMeasuredWidth() > mMaxWidth){ setMeasuredDimension(mMaxWidth, getMeasuredHeight()); } } }
and the xml attr
<!-- MaxWidthLinearLayout -->
<declare-styleable name="MaxWidthLinearLayout">
<attr name="maxWidth" format="dimension" />
</declare-styleable>
Now android.support.constraint.ConstraintLayout
makes it easier. Just wrap your view (of any type) with ConstraintLayout, and set the following attributes to the view:
android:layout_width="0dp"
app:layout_constraintWidth_default="spread"
app:layout_constraintWidth_max="640dp"
http://tools.android.com/recent/constraintlayoutbeta5isnowavailable
Add a Outer Layout or Viewgroup layer to your current Layout file. The height and width of this Layout will be the maximum height/width. Now your inner layout can be set to wrap content and is limited by the outer layout. E.g:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<!-- OuterLayout to set Max Height and Width -- Add this ViewGroup to your layout File -->
<LinearLayout
android:id="@+id/outerLayout"
android:layout_width="650dp"
android:layout_height="650dp"
android:orientation="vertical" >
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical" >
</LinearLayout>
</LinearLayout>
</LinearLayout>
Here is a simple answer,
Width/Height seem to always have to be set together. This is working in my view.
<Button
android:text="Center"
android:layout_width="100dp"
android:layout_height="fill_parent"
android:id="@+id/selectionCenterButton"
android:minWidth="50dp"
android:minHeight="50dp"
android:maxWidth="100dp"
android:maxHeight="50dp"
android:layout_weight="1" />
The button's parent is set to wrap content, so scales down, but up to a max of 400 wide (4 buttons).
참고URL : https://stackoverflow.com/questions/5875877/setting-a-maximum-width-on-a-viewgroup
'developer tip' 카테고리의 다른 글
이름이있는 브라우저에서 ASP.NET MVC FileContentResult를 사용하여 파일을 스트리밍 하시겠습니까? (0) | 2020.12.10 |
---|---|
회전하는 명령 줄 커서를 만드는 방법은 무엇입니까? (0) | 2020.12.10 |
Ruby에서 <<는 무엇을 의미합니까? (0) | 2020.12.10 |
int를 Android에서 문자열로 (0) | 2020.12.10 |
언제 어디서 GetType () 또는 typeof ()를 사용합니까? (0) | 2020.12.10 |