当容器的大小发生变化时,用FlowLayout管理的组件会发生变化,利用这个可以解决RelativeLayout布局中一些字符显示不全的问题

--- /dev/null
+++ b/alps/packages/apps/Settings/res/layout/preference_header_switch_item_linefeed.xml
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2006 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<!-- Layout of a header item in PreferenceActivity. -->
+<com.android.settings.FlowLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content" 
+    android:minHeight="48dp">
+
+    <LinearLayout
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:background="?android:attr/activatedBackgroundIndicator"
+        android:gravity="center_vertical"
+        android:minHeight="48dp"
+        android:paddingRight="?android:attr/scrollbarSize" >
+
+        <ImageView
+            android:id="@+id/icon"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_gravity="center"
+            android:layout_marginLeft="6dip"
+            android:layout_marginRight="6dip" />
+
+        <RelativeLayout
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginBottom="6dip"
+            android:layout_marginLeft="2dip"
+            android:layout_marginRight="6dip"
+            android:layout_marginTop="6dip"
+            android:layout_weight="1" >
+
+            <TextView
+                android:id="@+android:id/title"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:ellipsize="marquee"
+                android:fadingEdge="horizontal"
+                android:singleLine="true"
+                android:textAppearance="?android:attr/textAppearanceMedium" />
+
+            <TextView
+                android:id="@+android:id/summary"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_alignLeft="@android:id/title"
+                android:layout_below="@android:id/title"
+                android:ellipsize="end"
+                android:maxLines="2"
+                android:textAppearance="?android:attr/textAppearanceSmall" />
+        </RelativeLayout>
+    </LinearLayout>
+
+    <Switch
+        android:id="@+id/switchWidget"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_gravity="center"
+        android:clickable="true"
+        android:focusable="false"
+        android:padding="8dip" />
+
+</com.android.settings.FlowLayout>

--- /dev/null
+++ b/alps/packages/apps/Settings/src/com/android/settings/FlowLayout.java
@@ -0,0 +1,84 @@
+package com.android.settings;
+
+import java.util.Hashtable;
+
+import android.content.Context;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.view.View;
+import android.widget.RelativeLayout;
+
+public class FlowLayout extends RelativeLayout {
+	int mLeft,mRight,mTop,mBottom, curBottom;
+	Hashtable<View, Position> map = new Hashtable<View, FlowLayout.Position>();
+	
+	public FlowLayout(Context context){
+		super(context);
+	}
+	
+	public FlowLayout(Context context, AttributeSet attrs) {
+		super(context, attrs);
+		// TODO Auto-generated constructor stub
+	}
+
+	@Override
+	protected void onLayout(boolean changed, int l, int t, int r, int b) {
+		// TODO Auto-generated method stub
+//		super.onLayout(changed, l, t, r, b);
+		int count = getChildCount();
+        for (int i = 0; i < count; i++) {
+                View child = getChildAt(i);
+                Position pos = map.get(child);
+                if (pos != null) {
+                        child.layout(pos.left, pos.top, pos.right, pos.bottom);
+                } else {
+                        Log.i("MyLayout", "error");
+                }
+        }
+	}
+	
+	public int getPosition(int IndexInRow, int childIndex) {
+        if (IndexInRow > 0) {
+                return getPosition(IndexInRow - 1, childIndex - 1)
+                                + getChildAt(childIndex - 1).getMeasuredWidth()+10;
+        }
+        return 0;
+	}
+	
+	@Override
+    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+            // TODO Auto-generated method stub
+            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+            int width = MeasureSpec.getSize(widthMeasureSpec);
+            mLeft = 0;
+            mRight = 0;
+            mTop = 0;
+            mBottom = 0;
+            int j = 0;
+            int count = getChildCount();
+            for (int i = 0; i < count; i++) {
+                    Position position = new Position();
+                    View view = getChildAt(i);
+                    mLeft = getPosition(i - j, i);
+                    mRight = mLeft + view.getMeasuredWidth();
+                    if (mRight >= width) {
+                            j = i;
+//                            mLeft = getPosition(i - j, i);
+                            mLeft = width - view.getMeasuredWidth();
+                            mRight = mLeft + view.getMeasuredWidth();
+                            mTop += getChildAt(i).getMeasuredHeight();
+                    }
+                    mBottom = mTop + view.getMeasuredHeight();
+                    position.left = mLeft;
+                    position.top = mTop;
+                    position.right = mRight;
+                    position.bottom = mBottom;
+                    map.put(view, position);
+            }
+            setMeasuredDimension(width, mBottom);
+    }
+
+	private class Position {
+        int left, top, right, bottom;
+}
+}

--- a/alps/packages/apps/Settings/src/com/android/settings/Settings.java
+++ b/alps/packages/apps/Settings/src/com/android/settings/Settings.java
@@ -522,7 +522,7 @@ public class Settings extends PreferenceActivity implements ButtonBarHandler {
                         break;
 
                     case HEADER_TYPE_SWITCH:
-                        view = mInflater.inflate(R.layout.preference_header_switch_item, parent,
+                        view = mInflater.inflate(R.layout.preference_header_switch_item_linefeed, parent,
                                 false);
                         holder.icon = (ImageView) view.findViewById(R.id.icon);
                         holder.title = (TextView)


Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐