2

我想自定义警报对话框标题背景,应用程序崩溃而不显示警报对话框。(自定义视图只填充消息区域,不包括标题面板和按钮面板。我想自定义默认的标题面板和按钮面板,这里以标题为例。)

public static class MyAlertDialog
{
    private static AlertDialog _alertDialog;

    public static void Show(Context context)
    {
        var factory = LayoutInflater.From(context);
        AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(context)
            .SetTitle("myTitle")
            .SetView(factory.Inflate(Resource.Layout.DialogRegister, null))
            .SetCancelable(true);

        _alertDialog = alertDialogBuilder.Create();
        var titleView = (TextView)_alertDialog.FindViewById(Android.Resource.Id.Title); //get title view from the Android resource not from my custom view
        //titleView.SetBackgroundResource(Resource.Color.PrimaryColor);
        titleView.SetBackgroundColor(Android.Graphics.Color.Red); 
        _alertDialog.Show();  

    }
}

我从主要活动中调用对话框:

[Activity(Label = "My Activity", MainLauncher = true)]
public class HomeActivity : Activity
{
    protected override void OnCreate(Bundle bundle)
    {
        base.OnCreate(bundle);

        SetContentView(Resource.Layout.home);

        Button btnMyButton = FindViewById<Button>(Resource.Id.MyButton);
        btnMyButton.Click += (object sender, EventArgs e) =>
        {
            MyAlertDialog.Show(this);
        };

        ......
     }
 }

VS 抛出运行时异常并要求我中断或继续。我点击继续。然后应用程序崩溃。日志:

03-09 11:10:47.057 E/mono    ( 1185): [0x4001f730:] EXCEPTION handling: Android.Util.AndroidRuntimeException: Exception of type 'Android.Util.AndroidRuntimeException' was thrown.
03-09 11:10:49.956 I/Email   (  451): ReconcilePopImapAccountsSync: start
03-09 11:10:50.276 I/Email   (  451): ReconcilePopImapAccountsSync: done
03-09 11:11:07.417 E/mono    ( 1185): [0x4001f730:] EXCEPTION handling: Java.Lang.NullPointerException: Exception of type 'Java.Lang.NullPointerException' was thrown.
03-09 11:11:07.727 E/mono    ( 1185): [0x4001f730:] EXCEPTION handling: Java.Lang.NullPointerException: Exception of type 'Java.Lang.NullPointerException' was thrown.
03-09 11:11:16.846 F/        ( 1185): * Assertion: should not be reached at /Users/builder/data/lanes/monodroid-lion-bigsplash/0e0e51f9/source/mono/mono/mini/debugger-agent.c:5980
03-09 11:11:16.846 I/mono    ( 1185): Stacktrace:
03-09 11:11:16.846 I/mono    ( 1185): 
03-09 11:11:16.866 E/mono    ( 1185): [0x2a118c70:] EXCEPTION handling: System.NullReferenceException: Object reference not set to an instance of an object
03-09 11:11:16.906 E/mono    ( 1185): 
03-09 11:11:16.906 E/mono    ( 1185): Unhandled Exception:
03-09 11:11:16.906 E/mono    ( 1185): System.NullReferenceException: Object reference not set to an instance of an object
03-09 11:11:16.937 I/mono    ( 1185): [ERROR] FATAL UNHANDLED EXCEPTION: System.NullReferenceException: Object reference not set to an instance of an object

我在模拟器中使用 Android 4.1.2 armeabi-v7a 对其进行了测试。(该项目将支持架构 armeabi、armeabi-v7a 和 x86。)

谢谢你的帮助。(我知道我可以将带有消息的标题放在自定义内容视图中。但我也想自定义它的其他部分。所以我只是以标题为例。)

我注意到虽然我 SetTitle("myTitle"),但 titleView.text 是一个空字符串。我在获取默认标题视图时错了吗

var titleView = (TextView)_alertDialog.FindViewById(Android.Resource.Id.Title);

同样,我的自定义视图不包含标题视图。

4

3 回答 3

3

你的代码很乱,可能有多个问题,但我认为这一行是你的问题

txView.SetBackgroundResource(Resource.Color.PrimaryColor);

正如您在文档中看到那样,您应该只传递对 a 的引用Drawable作为参数而不是 a Color

您需要在这里使用此方法,如下所示: txView.SetBackgroundColor(Resource.Color.PrimaryColor);

问题中的代码也无法编译, txView 变量来自哪里?我假设它是titleView?

还有一件事;每次运行项目时都会显示您发布的日志条目,您可以忽略它。请参阅此处了解更多信息。您应该发布的实际日志条目会晚得多(并且仅您单击 Visual Studio 中的继续之后)

于 2013-03-09T09:39:40.283 回答
1

您需要告诉在哪个视图中找到 id。所以view在获取factory.

var view = factory.Inflate(Resource.Layout.DialogRegister, null);

因为titleView会引用null,所以会导致崩溃,

然后,您可以找到title使用view您刚刚创建的。需要指出的是, Android.Resource在 Mono for Android 中对 Android 框架资源的Resource引用,实际上是对您的布局、ID 等的引用。因此,代码如下:

var titleView = view.FindViewById<TextView>(Resource.Id.title);

SetBackgroundResource只能将drawable作为有效参数,所以color在这种情况下不起作用。但是SetBackgroundColor会起作用,因为Android.Graphics.Color.Red它是一个Color对象。

此外,您可以SetView(view)在构建对话框时。

于 2013-03-09T01:21:34.277 回答
0

我只会使用对话框。您重写 OnCreateDialog 方法。如果需要,您可以在那里设置内容视图并设置自定义标题。您还可以自定义对话框。这是一些示例代码,有一个 SetTitle 方法。这是一个简短的示例,更多可以在代码下方的链接中找到。

此代码显示如何连接按钮单击以显示对话框。单击按钮后,将调用 OnCreateDialog 并且系统将显示您的对话框。

const int NewGame = 1;
protected override Dialog OnCreateDialog(int id)
    {
        switch (id)
        {
            case NewGame:
                Dialog d = new Dialog(this);// Create the new dialog
                d.SetTitle("New Game");//Set the title.
                d.SetContentView(Resource.Layout.ActNewGame);//Set the layout resource.
                //here you can use d.FindViewById<T>(Resource)
             return d;
        }
        return null;
    }

}

// wire up a button click in the OnCreate method.
btnNewGame.Click += (o, e) =>
        {

                ShowDialog(NewGame);
        };

http://xandroid4net.blogspot.com/2014/09/xamarinandroid-ways-to-customize-dialogs.html

于 2014-09-21T02:52:49.653 回答