0

我想重新设计我的警报对话框(以更改此对话框的窗口)。我试图在网上搜索,我没有找到有用的东西。我还尝试为警报对话框设置布局,但我没有找到执行此操作的系统...我是 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();
    }

} 
4

1 回答 1

0

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

这使您有两种选择之一。

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

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

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

(2) 为您选择的 Android 版本构建一个模仿警报的活动。

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

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()。如果您想在多个活动中干净地回收警报对话框,这可能很有用;或者,如果您需要启动警报对话框以响应来自后台的系统活动,或按下通知栏按钮等。

希望有帮助。简短的回答:尽可能使用 AlertDialog.Builder.setView。

于 2013-02-16T19:28:24.543 回答