我做了一些this article的挖掘工作,但无法获得任何可行的解决方案。
我的问题: 我的所有屏幕都包含标题布局。根据屏幕的宽度,我想显示三种不同的标题布局之一。边注;我的应用程序仅支持纵向模式。
我的布局是:
并且应由应用程序根据屏幕宽度自动选择它们。我想以编程的方式来解决这个问题,因为我在每次活动中都需要做很多事情,所以如果可以正确地执行以便系统可以处理的话,那就太好了。
我尝试了(但没有用):
非常感谢您提前回答!
编辑: 布局实际上看起来比这里描述的要复杂一些。实际的布局如下:
<LinearLayout>
<RelativeLayout>
<ImageView />
<LinearLayout>
<LinearLayout>
<ImageView />
<TextView />
</LinearLayout>
<LinearLayout>
<ImageView />
<TextView />
</LinearLayout>
</LinearLayout>
</RelativeLayout>
</LinearLayout>
第一个ImageView中的图像也是从互联网上加载的,在加载之前我不知道它的大小。
答案 0 :(得分:1)
我为您创建了此布局。您只需要创建一个XML文件并将这些项目放在此容器中即可。设置元素的重要性。如果没有足够的空间,那么重要性较低的项目将被删除(消失)。请告诉我您是否需要补充或更改的内容。在我的设备上可以正常工作。
示例
<com.sup.dev.android.views.widgets.layouts.LayoutImportance
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@color/red_700"
android:text="text_1"
app:LayoutImportance_Layout_importance="5"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@color/blue_700"
app:LayoutImportance_Layout_importance="1"
android:text="teeeeeeeeext_2"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@color/green_700"
app:LayoutImportance_Layout_importance="2"
android:text="teeeeeeeeext_3_teeeeext"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@color/amber_700"
app:LayoutImportance_Layout_importance="3"
android:text="teeeeeeeeext_4_teeeeeeeeeeeeeeeeeeext"/>
</com.sup.dev.android.views.widgets.layouts.LayoutImportance>
LayoutImportance.java
public class LayoutImportance extends LinearLayout {
private int lock;
public LayoutImportance(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
if (lock == 0) for (int i = 0; i < getChildCount(); i++) getChildAt(i).setVisibility(VISIBLE);
int w = MeasureSpec.getSize(widthMeasureSpec);
super.onMeasure(MeasureSpec.makeMeasureSpec(w, MeasureSpec.UNSPECIFIED), heightMeasureSpec);
if (getMeasuredWidth() > w) {
ArrayList<View> children = new ArrayList<>();
for (int i = 0; i < getChildCount(); i++) if (getChildAt(i).getVisibility() == VISIBLE) children.add(getChildAt(i));
if(children.isEmpty())return;
Collections.sort(children, (o1, o2) -> ((LayoutParams) o1.getLayoutParams()).importance - ((LayoutParams) o2.getLayoutParams()).importance);
children.get(0).setVisibility(GONE);
lock++;
onMeasure(widthMeasureSpec, heightMeasureSpec);
lock--;
}
}
@Override
protected boolean checkLayoutParams(ViewGroup.LayoutParams p) {
return p instanceof LayoutParams;
}
@Override
protected LayoutParams generateDefaultLayoutParams() {
return new LayoutParams(getContext(), null);
}
@Override
public LayoutParams generateLayoutParams(AttributeSet attrs) {
return new LayoutParams(getContext(), attrs);
}
@Override
protected LayoutParams generateLayoutParams(ViewGroup.LayoutParams p) {
return new LayoutParams(p.width, p.height);
}
public static class LayoutParams extends LinearLayout.LayoutParams {
public int importance;
public LayoutParams(Context context, AttributeSet attrs) {
super(context, attrs);
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.LayoutImportance_Layout);
importance = a.getInt(R.styleable.LayoutImportance_Layout_LayoutImportance_Layout_importance, 0);
a.recycle();
}
public LayoutParams(int w, int h) {
super(w, h);
}
}
}
attrs.xml
<declare-styleable name="LayoutImportance_Layout">
<attr name="LayoutImportance_Layout_importance" format="integer"/>
</declare-styleable>
答案 1 :(得分:0)
我认为您必须获取每个页眉的布局宽度并为每个页眉进行不同的布局。然后以编程方式检查屏幕尺寸,并且在放大布局之前,必须将页眉设置为与您的宽度相对应。
使用此代码获取设备的宽度:
DisplayMetrics displayMetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
int height = displayMetrics.heightPixels;
int width = displayMetrics.widthPixels;
然后
if(width==smallDevice){ //or whatever condition you want
setHeaderLayoutFor("smallDevice");
}
else if(width=="mediumDevice"){
setHeaderLayoutFor("mediumDevice");
}
else if(width=="largerDevice"){
setHeaderLayoutFor("largeDevice");
}
并设置setHeaderLayoutFor(String layoutType)以设置/增加布局。
答案 2 :(得分:0)
您可以使用“可扩展dp”(sdp)。此尺寸单位随屏幕尺寸缩放。
要将sdp添加到您的项目中(使用Android Studio和Gradle):
在您的build.gradle依赖项块中添加实现'com.intuit.sdp:sdp-android:1.0.5'。
dependencies {
implementation 'com.intuit.sdp:sdp-android:1.0.5'
}
如下所示设计xml:
<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"
android:background="@android:color/white"
android:gravity="center">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical">
<LinearLayout
android:id="@+id/give_us_a_review_landmine_main_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="vertical"
android:paddingBottom="@dimen/_27sdp"
android:paddingLeft="@dimen/_43sdp"
android:paddingRight="@dimen/_43sdp"
android:paddingTop="@dimen/_50sdp" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Intuit"
android:textColor="@android:color/black"
android:textSize="@dimen/_40sdp"/>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/_minus10sdp"
android:paddingBottom="@dimen/_15sdp"
android:orientation="horizontal" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:includeFontPadding="false"
android:text="♡"
android:textColor="#ED6C27"
android:textSize="@dimen/_70sdp"
android:textStyle="bold" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:includeFontPadding="false"
android:text="U"
android:textColor="@android:color/black"
android:textSize="@dimen/_70sdp" />
</LinearLayout>
<TextView
android:id="@+id/give_us_a_review_landmine_text_1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:paddingBottom="@dimen/_12sdp"
android:text="Rate us so we can grow and help more people get their finances in check"
android:textColor="@android:color/black"
android:textSize="@dimen/_16sdp" />
<TextView
android:id="@+id/give_us_a_review_landmine_text_2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:text="★★★★★"
android:textColor="#747474"
android:textSize="@dimen/_22sdp"
android:textStyle="bold" />
<Button
android:id="@+id/give_us_a_review_landmine_button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginTop="@dimen/_25sdp"
android:padding="@dimen/_8sdp"
android:text="Rate"
android:textSize="@dimen/_15sdp"
android:visibility="visible"
android:textColor="@android:color/white"
android:gravity="center"
android:minWidth="120dp"
android:includeFontPadding="false"
android:background="#0ac775"
android:singleLine="true" />
</LinearLayout>
</LinearLayout>
</RelativeLayout>
查看链接以获取更多信息:https://github.com/intuit/sdp