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);

ドキュメントのhereでわかるように、 aDrawableではなく 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。指摘すべきことの 1 つ Android.Resourceは、Mono for Android の Android フレームワークのリソースへResourceの参照であり、実際にはレイアウト、ID などへの参照です。したがって、コードは次のようになります。

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

SetBackgroundResourcedrawable は有効なパラメーターとしてのみ使用できるため、この場合、色は機能しません。ただし、オブジェクトであるSetBackgroundColorため機能します。Android.Graphics.Color.RedColor

また、ダイアログの作成中にもできますSetView(view)

于 2013-03-09T01:21:34.277 に答える
0

I would just use dialogs. You override the OnCreateDialog method. There you can set a contentview and set a custom title if needed. You can also customize the dialog.Here is some example code, there is a SetTitle method. Here is a brief example more can be found at the link below the code.

This code shows how to wire up a button click to show the dialog. Once the button is clicked the OnCreateDialog will be called and the system will show your dialog.

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 に答える