Добавить событие, нажав кнопку дизайна axml в монодроиде?

Можно ли добавить событие нажатия кнопки, щелкнув дизайн axml? если да то как? если нет, как я могу добавить другим способом? Я пытаюсь сделать свое первое приложение с помощью Visual Studio 2010.

образец кода

public class Activity1 : Activity
{
     string dbPath = System.IO.Path.Combine(System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal), "tdsl_validation.sqlite");



        private Button login_button;
        private EditText  user;
        private EditText passs;






    protected override void OnCreate(Bundle bundle)
    {
        var ss=dbPath;

         base.OnCreate(bundle);
         user = (EditText)FindViewById(Resource.Id.editText1);
         passs = (EditText)FindViewById(Resource.Id.editText3);
         login_button = (Button)FindViewById(Resource.Id.button1);
         login_button.Click += new EventHandler(button1_Click);
         SetContentView(Resource.Layout.Main);


    }


    private  bool validate_user(string username, string password)
    {
        bool i;
        i = true;
        string str;

        DataTable dt = new DataTable();
        string dbPath1 = System.IO.Path.Combine(System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal), "tdsl_validation.sqlite");

        SqliteConnection con = new SqliteConnection("Data Source="+ dbPath1);
        str = "select pass from user_detail where user_name='" + username + "' and pass='" + password + "'";
        SqliteCommand cmd = new SqliteCommand(str, con);
        SqliteDataAdapter da = new SqliteDataAdapter(cmd);
        da.Fill(dt);


        if (dt != null)
        {
            if (dt.Rows.Count > 0)
            {
                i = true;

            }
            else
            {
                i = false;
            }

        }
        else
        {
            i = false;
        } 

        return i;

    }





    void button1_Click(object sender, EventArgs e)
    {
        bool i;
         user = (EditText)FindViewById(Resource.Id.editText1);
         passs = (EditText)FindViewById(Resource.Id.editText3);
         i = validate_user(user.Text, passs.Text);

         i = validate_user(user.Text, passs.Text);
         if (i == true)
         {

         }
         else
         {
             Toast.MakeText(this, "Invalid Username or Password", ToastLength.Short).Show();
         }



        // stuff here
    }








}

person Vikky    schedule 18.06.2012    source источник


Ответы (1)


Шаблон проекта по умолчанию для нового приложения Mono для Android включает пример обработки события нажатия кнопки. Я не верю, что у нынешнего дизайнера есть способ подключить это вручную. Используя пример из шаблона по умолчанию, предположим, что кнопка в вашем макете, Main.axml, имеет идентификатор "MyButton" (@+id/MyButton). В вашей деятельности вам нужно будет сделать следующее:

Во-первых, объявите, что Main.axml должен использоваться в качестве макета для действия:

SetContentView(Resource.Layout.Main);

Как только вы объявите макет, вы можете получить ссылки на элементы внутри макета. Это позволяет получить ссылку на кнопку:

Button button = FindViewById<Button>(Resource.Id.MyButton);

Получив это, вы можете подключиться к событию Click на этой кнопке, чтобы обработать нажатие кнопки:

button.Click += delegate { 
    // handle the click event here
};

В качестве альтернативы, если вы хотите использовать отдельный метод для обработчика кликов, а не определять его как встроенный, вы можете сделать что-то вроде этого:

button.Click += ButtonClicked;

private void ButtonClicked(object sender, EventArgs eventArgs)
{
    // handle button click here
}

Изменить (на основе комментариев и обновленного вопроса)

Как упоминалось ранее, SetContentView() необходимо вызвать прежде, чем вы сможете вызвать FindViewById(). SetContentView() сообщает Android, какой макет вы хотите использовать для активности, поэтому, пока вы этого не сделаете, он не будет знать, где найти элементы пользовательского интерфейса. Переместите вызов SetContentView() над вызовами FindViewById(), а также убедитесь, что нужный макет — это Main.axml. Если у него другое имя, вам нужно указать правильное имя при вызове SetContentView().

Я бы также предложил значительно упростить ваш код для начала, просто чтобы сузить круг потенциально возможных проблем. В настоящее время при нажатии кнопки вы начнете пытаться получить доступ к базе данных и выполнять другие действия, но я бы посоветовал просто заставить ваш обработчик кликов работать правильно, прежде чем делать этот шаг.

person Greg Shackles    schedule 18.06.2012
comment
Необработанное исключение: System.NullReferenceException: ссылка на объект не указывает на экземпляр объекта. я использовал login_button = (Button)FindViewById(Resource.Id.button1); login_button.Click += button1_Click; - person Vikky; 18.06.2012
comment
Вы установили вызов SetContentView(), используя макет, содержащий кнопку1? Это должно произойти, прежде чем вы сможете вызвать FindViewById(). - person Greg Shackles; 18.06.2012
comment
пользователь = (EditText)FindViewById(Resource.Id.editText1); проходы = (EditText)FindViewById(Resource.Id.editText3); login_button = (Кнопка)FindViewById(Resource.Id.button1); SetContentView(Resource.Layout.Main); login_button.Click += button1_Click; сообщение об ошибке появляется при выполнении последней строки - person Vikky; 18.06.2012
comment
Почему вы снова вызываете SetContentView() перед присоединением обработчика кликов? Я предполагаю, что вы также вызываете его перед другими вызовами FindViewById(), иначе они тоже не будут работать. Если бы мне пришлось угадывать, и это предположение, потому что у меня здесь не так много деталей, я бы сказал, что ваш макет не называется Main, и вы теряете ссылку на элемент пользовательского интерфейса, сбрасывая макет. Пожалуйста, предоставьте больше деталей/кода (в идеале не в комментариях, чтобы они были читаемы), если у вас все еще есть проблемы. - person Greg Shackles; 18.06.2012
comment
привет, я добавил соды в вопросе - person Vikky; 18.06.2012
comment
я добавил SetContentView(Resource.Layout.Main); ниже base.OnCreate (комплект); и он работает. благодарю вас - person Vikky; 18.06.2012