以编程方式添加不匹配主题的按钮

时间:2015-08-24 14:42:21

标签: android

在Gingerbread(API 10)中使用Theme.AppCompat,以编程方式添加的按钮与通过XML添加的按钮不匹配。它适用于所有较新的API,它只是Gingerbread的一个问题。 This image shows the issue.

以下是添加按钮的代码:

for (int i = 0; i < btnFiles.length; i++) {
        btnFiles[i] = new Button(this);
        btnFiles[i].setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
        btnFiles[i].setGravity(Gravity.CENTER);                         
        btnFiles[i].setId(100 + i);                                     
        btnFiles[i].setText(fileList.get(i).replace(".xml", ""));       
        btnFiles[i].setTag(fileList.get(i));                            
        registerForContextMenu(btnFiles[i]);                            
        btnFiles[i].setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {                          

                Continue(v);        //Start next activity when button is pressed
            }

        });

        l.addView(btnFiles[i]);     
        setTitle(getString(R.string.title_activity_load_menu));
    }

2 个答案:

答案 0 :(得分:1)

使用Button创建一个布局文件,并使用LayoutInflater对其进行充气。

<Button xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    ... />

LayoutInflater inflater = getLayoutInflater();
for (int i = 0; i < btnFiles.length; i++) {
    btnFiles[i] = (Button) inflater.inflate(R.layout.button, l, false);
    // everything else, except the LayoutParams stuff because that's in the layout file
}

答案 1 :(得分:1)

为了澄清任何路过的人,问题可能是来自XML的<Button>标记被AppCompatButton<item name="buttonStyle">...</item>的实例取代(假设已经过去了用过的)适用于那个。许多其他观点也会发生同样的事情。

因此,替代可能性可以将<item name="buttonStyle">...</item><item name="android:buttonStyle">...</item>放入样式中,以便ButtonAppCompatButton可以合并,这将是非常混乱

更好的选择是使用AppCompat为API实例化AppCompatButton,但使用 XML布局只使用单个按钮似乎是最安全的最便携的解决方案,所以去那个,假设您没有理由不这样做。