2013-08-27 62 views

回答

0

你可以把一个弹出式的视图,或作为saperate活动甚至(透明backgound,看看Android上的主题选项)

然后,当你想显示弹出,你可以启动它从应用程序中的任何活动中,它始终具有与bg和按钮相同的样式,您只会将其实际数据馈送给它。

对于〔实施例:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="300dp" 
android:background="@drawable/bg_popup" 
android:layout_gravity="center" 
android:alpha="0.8" 
android:visibility="visible" 
android:id="@+id/generic_popup2_container" 
android:layout_height="300dp"> 
<TextView 
    android:id="@+id/generic_popup2_tv_title" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:textColor="@color/white" 
    android:layout_centerHorizontal="true" 
    android:layout_marginTop="20dp" 
    android:layout_alignParentTop="true" 
    android:text="header" 
    android:gravity="center" 
    android:textSize="28sp" /> 
<TextView 
    android:id="@+id/generic_popup2_tv_inner_text" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:textColor="@color/white" 
    android:text="content" 
    android:textSize="16sp" 
    android:gravity="center" 
    android:layout_marginTop="20dp" 
    android:layout_below="@id/generic_popup2_tv_title" 
    android:layout_centerHorizontal="true" /> 
<LinearLayout 
    android:id="@+id/generic_popup_2_buttons_layout" 
    android:layout_centerHorizontal="true" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentBottom="true" 
    android:layout_marginBottom="20dp" 
    android:orientation="horizontal"> 
    <Button 
     android:id="@+id/layout_2_generic_popup_btn_action1" 
     android:layout_width="115dp" 
     android:layout_height="35dp" 
     android:textColor="@color/white" 
     android:layout_marginBottom="10dp" 
     android:textSize="12sp" 
     android:layout_marginRight="10dp" 
     android:background="@drawable/popup_btn_blue" /> 
    <Button 
     android:id="@+id/layout_2_generic_popup_btn_action2" 
     android:layout_width="115dp" 
     android:layout_height="35dp" 
     android:textColor="@color/white" 
     android:textSize="12sp" 
     android:background="@drawable/popup_btn_blue" /> 
</LinearLayout> 

+0

其实我无法预测的TextView的计数,不知何故3,4,5和> 5,这样我就可以用这种方式为我的情况? –

+0

这就是通用性可能成为陷阱的地方,在图形方面以及如何通过代码实际构建它以保持通用并且能够维护它。 我会建议为每个弹出文件建立一个不同的布局,只是为了维护。 –

1

我有同样的问题来自定义PopupMenu的字体和文字大小。最后我用反射。它可以用于任何自定义弹出菜单项目。 android支持菜单项的资源布局是在android.support.v7.internal.view.menu.MenuPopupHelper中定义的,它的字段名是“ITEM_LAYOUT”,声明为static final;它的值等于“R.layout.abc_popup_menu_item_layout” 我在Grepcode中找到布局文件并将其复制到我的项目布局目录中。我将其命名为popup_menu_item_layout.xml。我的弹出式菜单项的布局来这里

<?xml version="1.0" encoding="utf-8"?> 
<mypackage.PopupMenuItemView 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="?attr/dropdownListPreferredItemHeight" 
    android:minWidth="196dip" 
    android:paddingRight="16dip"> 

<!-- Icon will be inserted here. --> 

<!-- The title and summary have some gap between them, and this 'group' should be centered vertically. --> 
<RelativeLayout 
     android:layout_width="0dip" 
     android:layout_weight="1" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center_vertical" 
     android:layout_marginLeft="16dip" 
     android:duplicateParentState="true"> 

    <TextView 
      android:id="@+id/title" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:layout_alignParentTop="true" 
      android:layout_alignParentLeft="true" 
      android:textAppearance="?attr/textAppearanceLargePopupMenu" 
      android:singleLine="true" 
      android:duplicateParentState="true" 
      android:ellipsize="marquee" 
      android:fadingEdge="horizontal"/> 

    <TextView 
      android:id="@+id/shortcut" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_below="@id/title" 
      android:layout_alignParentLeft="true" 
      android:textAppearance="?attr/textAppearanceSmallPopupMenu" 
      android:singleLine="true" 
      android:duplicateParentState="true"/> 

</RelativeLayout> 

<!-- Checkbox, and/or radio button will be inserted here. --> 

然后创建自定义类PopupMenuItemView:

public class PopupMenuItemView extends android.support.v7.internal.view.menu.ListMenuItemView { 

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

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

@Override 
protected void onFinishInflate() { 
    super.onFinishInflate(); 

    applyTypefaceToAll(this, your_typeface); 
    TypefaceUtils.applyTextSizeToAll(this, your_textsize); 
} 

public static void applyTypefaceToAll(View view, Typeface typeface) { 
    if (view instanceof ViewGroup) { 
     ViewGroup viewGroup = (ViewGroup) view; 
     for (int childIndex = 0; childIndex < viewGroup.getChildCount(); childIndex++) 
      applyTypefaceToAll(viewGroup.getChildAt(childIndex), typeface); 
    } else if (view instanceof TextView) { 
     TextView textView = (TextView) view; 
     textView.setTypeface(typeface); 
     textView.setPaintFlags(textView.getPaintFlags() | Paint.SUBPIXEL_TEXT_FLAG | Paint.DEV_KERN_TEXT_FLAG | Paint.ANTI_ALIAS_FLAG); 
    } 
} 

public static void applyTextSizeToAll(View view, float size) { 
    if (view instanceof ViewGroup) { 
     ViewGroup viewGroup = (ViewGroup) view; 
     for (int childIndex = 0; childIndex < viewGroup.getChildCount(); childIndex++) 
      applyTextSizeToAll(viewGroup.getChildAt(childIndex), size); 
    } else if (view instanceof TextView) { 
     TextView textView = (TextView) view; 
     textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, size); 
     textView.setPaintFlags(textView.getPaintFlags() | Paint.SUBPIXEL_TEXT_FLAG | Paint.DEV_KERN_TEXT_FLAG | Paint.ANTI_ALIAS_FLAG); 
    } 
} 
} 

最后替换布局资源ID通过反射菜单项;一些在您的主要活动onCreate方法或在您的应用程序的onCreate方法,其中,如:

try { 
     setFinalStatic(MenuPopupHelper.class.getDeclaredField("ITEM_LAYOUT"), 
       R.layout.popup_menu_item_layout); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

    public static void setFinalStatic(Field field, Object newValue) throws Exception { 
    field.setAccessible(true); 

    try { 
     Field modifiersField = Field.class.getDeclaredField("modifiers"); 
     modifiersField.setAccessible(true); 
     modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL); 
    }catch (Exception e) { 
     e.printStackTrace(); 
    } 

    field.set(null, newValue); 
} 
相关问题