当容器的大小发生变化时,用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)