如何重新设计AlertDialog

时间:2013-02-16 17:04:54

标签: android eclipse android-widget

我想重新设计我的警告对话框(更改此窗口的窗口)。我试图在网上搜索,我找不到有用的东西。我也尝试为警报对话框添加一个布局,但我没有找到系统来做这个......我是Android的初学者。我的代码:

import android.os.Bundle;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.Button;
import android.app.Activity;
import android.app.AlertDialog;
import android.view.View.OnClickListener;

public class Magie extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.magie);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);

        final Button magie1 = (Button) findViewById(R.id.bma1);
        magie1.setOnClickListener(new OnClickListener(){

            public void onClick(View v) {
                // TODO Auto-generated method stub
            magie1();
            }

        });

        final Button magie2 = (Button) findViewById(R.id.bma2);
        magie2.setOnClickListener(new OnClickListener(){

            public void onClick(View v) {
                // TODO Auto-generated method stub
            magie2();
            }

        });

        final Button magie3 = (Button) findViewById(R.id.bma3);
        magie3.setOnClickListener(new OnClickListener(){

            public void onClick(View v) {
                // TODO Auto-generated method stub
            magie3();
            }

        });

        final Button magie4 = (Button) findViewById(R.id.bma4);
        magie4.setOnClickListener(new OnClickListener(){


            public void onClick(View v) {
                // TODO Auto-generated method stub
            magie4();
            }

        });
    }

    private void magie1(){
        AlertDialog.Builder ad = new AlertDialog.Builder(this);
        ad.setTitle("title1");
        ad.setMessage("text1");
        ad.show();
    }

    private void magie2(){
        AlertDialog.Builder ad = new AlertDialog.Builder(this);
        ad.setTitle("title2");
        ad.setMessage("text2");
        ad.show();
    }

    private void magie3(){
        AlertDialog.Builder ad = new AlertDialog.Builder(this);
        ad.setTitle("title3");
        ad.setMessage("text3");
        ad.show();
    }

    private void magie4(){
        AlertDialog.Builder ad = new AlertDialog.Builder(this);
        ad.setTitle("title4");
        ad.setMessage("Text4");
        ad.show();
    }

} 

1 个答案:

答案 0 :(得分:0)

警告的窗口装饰和主题从Android版本到Android版本大不相同,并且还经常通过OEM修改给定版本来定制。没有安全的方法来回收android AlertDialog系统资源和活动中的主题。隐藏了一些必需的资源; AlertDialogs的大部分内容都是使用代码而不是布局文件构建的。奇怪但真实。

这使您有两种选择之一。

(1)使用AlertDialog.Builder.setView()将自定义布局插入警报对话框。

绝对是首选方法。这种方法存在轻微的主题问题。明智的做法是不要假设背景为白色或黑色,并且明智地不要覆盖任何控件上的默认颜色。 (例如,三星Galaxy Tab 1.0即使在使用灯光主题时也显示蓝色背景上的所有警报,并且在使用灯光主题时在蓝色背景上显示不可读的黑色文本)。如果您必须在视图中使用显式颜色(或使用Light主题),请确保您的视图具有纯色背景(浅色主题为白色,默认主题为黑色)。

如果可以,使用AlertDialog.Builder方法添加对话框按钮。如果您想在Alert对话框中使用标题栏,请不要忘记调用AlertDialog.Builder.setIcon和AlertDialog.Builder.setTitle。

(2)构建一个模拟所选Android版本警报的活动。

执行此操作时,在运行时不可能使用Android系统资源。但是,如果需要,您可以从Android SDK中窃取资源。所有版本的android的库存资源文件都可以在SDK的“platforms”目录中找到。一般的想法是,您将为活动设置样式,删除所有装饰,然后在布局文件中模拟窗口装饰。

styles.xml:

<style name="Theme.TutorialDialog" parent="android:style/Theme.Black">
    <item name="android:windowNoTitle">true</item>
    <item name="android:windowContentOverlay">@null</item>
    <item name="android:windowIsFloating">true</item>
</style>

AndroidManifest.xml:
     <activity
          android:name="com.twoplay.twoplayer2.TutorialActivity"
          ...
      android:theme="@style/TutorialDialog" 
     />

这会生成一个透明的Activity,它浮动在紧邻它下面的Activity的顶部。然后由您重新创建标题栏和按钮。在布局中使用填充或边距在内容周围添加透明边框。从sdk平台目录中清除可以使用的资源。不,没有现成的方法来重新创建警告对话框使用的按钮样式。这是一个很难的方法,应该只作为最后的手段使用。

有时有用的模式:创建包装警报对话框的Activity。使用上面给出的自定义主题删除窗口装饰。在Activity.onCreate中,您不设置视图;把它留空然后在onCreate中创建并显示警报。警报的按钮处理程序然后在封闭活动上调用Activity.finish()。如果要在多个活动中干净地回收警报对话框,这将非常有用;或者如果您需要从后台启动警报对话框以响应系统活动,或按下通知栏按钮,&amp; c。

希望有所帮助。简短的回答:如果人类可能的话,请使用AlertDialog.Builder.setView。