Android:我的编程按钮与我的 XML 按钮不匹配



我正在尝试在我的一个活动中动态创建按钮,但它们看起来不像我想要的那样,特别是它们与我使用 XML 创建的按钮不匹配(看起来是我想要的(。

我已经为应用程序创建了一个自定义主题,但它似乎并不完全适用于我使用代码创建的按钮。

[风格.xml]

<resources>
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
</style>
<!-- Cool dark purple theme theme. -->
<style name="DarkPurpleTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="colorPrimary">@color/dpColorPrimary</item>
<item name="colorPrimaryDark">@color/dpColorPrimaryDark</item>
<item name="colorAccent">@color/dpColorAccent</item>
<item name="android:background">@color/dpColorPrimary</item>
<item name="android:windowBackground">@color/dpColorPrimary</item>
<item name="android:colorBackground">@color/dpColorPrimary</item>
<item name="android:textColor">@color/dpColorAccent</item>/>
<item name="colorButtonNormal">@color/dpColorPrimaryDark</item>
<item name="colorControlHighlight">@color/dpColorAccent</item>
</style>
<!-- Cool dark purple theme button. -->
<!--
<style name="DarkPurpleButtonTheme" parent="Base.Widget.AppCompat.Button">
<item name="android:textColor">@color/dpColorAccent</item>/>
<item name="colorButtonNormal">@color/dpColorPrimaryDark</item>
<item name="colorControlHighlight">@color/dpColorAccent</item>
</style>
-->
<style name="DarkPurpleButtonTheme" parent="Base.Widget.AppCompat.Button">
<item name="colorPrimary">@color/dpColorPrimary</item>
<item name="colorPrimaryDark">@color/dpColorPrimaryDark</item>
<item name="colorAccent">@color/dpColorAccent</item>
<item name="android:background">@color/dpColorPrimary</item>
<item name="android:windowBackground">@color/dpColorPrimary</item>
<item name="android:colorBackground">@color/dpColorPrimary</item>
<item name="android:textColor">@color/dpColorAccent</item>/>
<item name="colorButtonNormal">@color/dpColorPrimary</item>
<item name="colorControlHighlight">@color/dpColorAccent</item>
</style>
</resources>

我在此XML中有2个看起来正确的按钮(当动态按钮看起来正确时将被删除(。

[activity_menu.xml]

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:theme="@style/DarkPurpleTheme"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<GridLayout
android:id="@+id/menu_btn_grid"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"        
android:columnCount="2" > 
<Button
android:id="@+id/trn_purchase"
android:drawableLeft="@drawable/ic_purchase64x64"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_column="0"
android:layout_row="0"
android:layout_gravity="fill"
android:layout_columnWeight="1"
android:text="@string/trn_purchase" />
<Button
android:id="@+id/trn_splitp"
android:drawableLeft="@drawable/ic_splitp64x64"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_column="1"
android:layout_row="0"
android:layout_gravity="fill"
android:layout_columnWeight="1"
android:text="@string/trn_splitp" />
</GridLayout>
</LinearLayout>

[菜单活动.java]

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setTheme( R.style.DarkPurpleTheme );
setContentView(R.layout.activity_menu);
MyMenu = this.getIntent().getStringExtra( START_MENU );
NewMenuItem( "Purchase", "ic_purchase64x64", 1 );
NewMenuItem( "Split Purchase", "ic_splitp64x64", 2 );
NewMenuItem( "Pre-Auth", "ic_preauth64x64", 3 );
NewMenuItem( "Pre-Auth Complete", "ic_auth_complt64x64", 4 );
}
private void NewMenuItem( String label, String image, int key )
{
GridLayout grid = ( GridLayout )this.findViewById( R.id.menu_btn_grid );
int count = grid.getChildCount();
int row = count / 2;
int column = count % 2;
AppCompatButton button = new AppCompatButton( new ContextThemeWrapper( this.getApplicationContext(), R.style.DarkPurpleButtonTheme ), null, R.style.DarkPurpleButtonTheme );
// Button button = new Button( new ContextThemeWrapper( this.getApplicationContext(), R.style.DarkPurpleButtonTheme ), null, R.style.DarkPurpleTheme );
button.setText( label );
button.setOnClickListener( new View.OnClickListener() {
@Override
public void onClick(View v) {
tranButton_Click(v);
}
});
button.setTag( key );
// button.setBackgroundColor( 0x262626 );
// button.setPadding( 25, 31, 25, 31 );
GridLayout.LayoutParams lp = new GridLayout.LayoutParams();
lp.width = 0;
lp.height = GridLayout.LayoutParams.WRAP_CONTENT;
lp.rowSpec = GridLayout.spec( row );
lp.columnSpec = GridLayout.spec( column, 1.0f );
lp.setGravity( GridLayout.LayoutParams.FILL_PARENT );
button.setLayoutParams( lp );
if ( (image != null) && (!image.isEmpty()) )
{
int imgid = GetResourceId( image );
Drawable img = this.getApplicationContext().getDrawable( imgid );
img.setBounds( 0, 0, img.getIntrinsicWidth(), img.getIntrinsicHeight() );
button.setCompoundDrawables( img, null, null, null );
}
grid.addView( button );
}

截图

嗯。 我找到了一个解决方法。 我不喜欢它,但它有效。

我可以通过创建按钮布局并膨胀每个按钮的布局来解决此问题。

我不喜欢这个解决方案,因为它没有解决为什么使用"new"创建的编程按钮与 XML 布局中的按钮不匹配的问题。

按钮布局:

<Button xmlns:android="http://schemas.android.com/apk/res/android"
android:drawableLeft="@drawable/ic_purchase64x64"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_column="0"
android:layout_row="0"
android:layout_gravity="fill"
android:layout_columnWeight="1"
android:text="button" />

按钮代码:

private void NewMenuItem( String label, String image, int key )
{
GridLayout grid = ( GridLayout )this.findViewById( R.id.menu_btn_grid );
int count = grid.getChildCount();
int row = count / 2;
int column = count % 2;
AppCompatButton button = ( AppCompatButton )getLayoutInflater().inflate( R.layout.widget_menubutton, null );
button.setText( label );
button.setOnClickListener( new View.OnClickListener() {
@Override
public void onClick(View v) {
tranButton_Click(v);
}
});
button.setTag( key );
// button.setPadding( 25, 31, 25, 31 );
GridLayout.LayoutParams lp = new GridLayout.LayoutParams();
lp.width = 0;
lp.height = GridLayout.LayoutParams.WRAP_CONTENT;
lp.rowSpec = GridLayout.spec( row );
lp.columnSpec = GridLayout.spec( column, 1.0f );
lp.setGravity( GridLayout.LayoutParams.FILL_PARENT );
button.setLayoutParams( lp );
if ( (image != null) && (!image.isEmpty()) )
{
int imgid = GetResourceId( image );
Drawable img = this.getApplicationContext().getDrawable( imgid );
img.setBounds( 0, 0, img.getIntrinsicWidth(), img.getIntrinsicHeight() );
button.setCompoundDrawables( img, null, null, null );
}
grid.addView( button );
}

最新更新