2017-02-03 6 views
0
структура

Справочник моей деятельности как нижеКнопка Нажмите обработчик не работает в Android Studio

enter image description here

Вот почему, чтобы получить идентификатор кнопки, я написал ниже код

View rootView = getLayoutInflater().inflate(R.layout.activity_login, null, false); 

btnLogin = (Button)rootView.findViewById(R.id.btnLogin); 

Но, по каким-то причинам, когда я нажимаю кнопку, это не входит в hander. Я что-то упускаю? Мой код ниже.

btnLogin.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View view) { 
    } 
}); 

Полный код деятельности

пакет com.example.pankajgarg.android.Activities.UserManagement.Auth.Login;

import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.Button; 
import android.widget.Toast; 

import com.example.pankajgarg.android.R; 

public class LoginActivity extends AppCompatActivity { 

    Button btnLogin; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 


     View rootView = getLayoutInflater().inflate(R.layout.activity_login, null, false); 

     btnLogin = (Button)rootView.findViewById(R.id.btnLogin); 
     btnLogin.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       Toast.makeText(getApplicationContext(),"Button was Clicked", Toast.LENGTH_SHORT).show(); 
      } 
     }); 

     setContentView(R.layout.activity_login); 
    } 
} 
+0

Помните, что весь код Java должен быть метод в классе. Измените свой вопрос, чтобы показать это. –

+0

Добавить Toast/войти в onClick и посмотреть, вызвана ли она! –

+1

Кроме того, у вас, похоже, есть функция входа ** **, поэтому почему вы раздуваете макет? Это сделано для Фрагментов. –

ответ

1

лучший способ вы можете идти о нем с помощью setContentView(R.layout.activity_login) в методе onCreate(), а затем потяните кнопку с findViewById(R.id.btnLogin).

protected void onCreate(Bundle savedInstanceState){ 
    super.onCreate(savedInstanceState); 
    //insert this line here 
    setContentView(R.layout.activity_login); 

    //Pull the button with the id 
    btnLogin = (Button) findViewById(R.id.btnLogin); 

    //set onclicklistener 
    btnLogin.setOnClickListener(new View.OnClickListener(){ 
    public void onClick(View view){ 
    Toast.makeText(getApplicationContext(),"Button was Clicked", Toast.LENGTH_SHORT).show(); 
    } 
}); 
} 
1
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 


    View rootView = getLayoutInflater().inflate(R.layout.activity_login, null, false); 

    btnLogin = (Button)rootView.findViewById(R.id.btnLogin); 
    btnLogin.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      Toast.makeText(getApplicationContext(),"Button was Clicked", Toast.LENGTH_SHORT).show(); 
     } 
    }); 

    setContentView(R.layout.activity_login); 
} 

Линия setContentView(R.layout.activity_login); раздувает расположение и отображает представления, определенные в XML. Это совершенно разные экземпляры, чем те, которые были созданы предыдущим вызовом, до inflate(). Кажется, вы смешиваете то, как мы раздуваем представление фрагмента, и как мы делаем это для активности. В разделе «Деятельность» мы просто вызываем setContentView(). Это означает, что вы должны изменить свой код к следующему:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_login); 

    btnLogin = (Button)findViewById(R.id.btnLogin); 
    btnLogin.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      Toast.makeText(getApplicationContext(),"Button was Clicked", Toast.LENGTH_SHORT).show(); 
     } 
    }); 
} 

Теперь код, чтобы установить OnClickListener найти нужную кнопку.

Обратите внимание, что первые две строки onCreate() всегда будут такими, как показано здесь. Единственным отличием будет имя макета, используемого в setContentView(). Вы будете избегать много головной боли, если вы всегда будете следовать этому образцу.

+0

У меня уже есть код в обработчике. но я не разделял код. Я мог убедиться, что обработчик не был вызван, потому что я использовал точку останова. –

+1

@PankajGarg, чтобы получить необходимую вам помощь, вы должны показать фактический код, который у вас есть, связанный с вашим вопросом. В этом случае точная логика внутри слушателя не имеет отношения к делу, но она заставила нас знать, что что-то есть. Комментарий, чтобы сказать нам, что вы умышленно упустил код, очень уместен. –

+0

@PankajGarg Я отредактировал свой ответ. Он очень похож на других, которые избили меня до удара. Основное различие заключается в том, что я добавил объяснение того, что вы делаете неправильно, а также решение для его устранения. –

0

Предполагая, что вы сделали то, что @ Code-ученик говорит (положить что-то выполнить), есть и другие вещи, которые могут произойти:

  • кнопка clickable? Проверьте это в макете или установить его с

    btnLogin.setClickable(true);

  • является кнопка enabled? То же, что и раньше.

  • есть ли другой View, перекрывающий кнопку, которая ловит клик перед этим?

2

Прежде всего, в деятельности вам не нужно, чтобы раздуть макет, вы связываете его с помощью метода setContentView:

setContentView(R.layout.activity_login); 

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

btnLogin = (Button)findViewById(R.id.btnLogin); 
btnLogin.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View view) { 
     // do whatever like... 
     Log.d("MyActivity", "Click!"); 
     Toast.makeText(this, "Click!", Toast.LENGTH_SHORT); 
    } 
}); 

Или вы можете сделать это следующим образом:

btnLogin = (Button)findViewById(R.id.btnLogin); 
btnLogin.setOnClickListener(this); 

Если вы делаете это таким образом, вы должны реализовать View.OnClickListener в своей деятельности с:

public class LoginActivity extends Activity implements View.OnClickListener { 
    // Your Activity code 
} 

И, наконец, опять же, если вы ничего не делаете в методе клик Android не будет делать это, так:

@Override 
public void onClick(View view) { 
    // do whatever like... 
    Log.d("MyActivity", "Click!"); 
    Toast.makeText(this, "Click!", Toast.LENGTH_SHORT); 
} 
+0

Если вы вызываете 'setOnClickListener (this)', тогда вам не нужно вызывать 'setOnClickListener (новый View.OnClickListener()), так как вы уже будете переопределять метод onClick()' в своей деятельности. Если я неправильно прочитаю ваш ответ. – Pztar

+0

Да, вы правы, есть два способа: один в моем ответе и анонимный способ, как в вопросе OP –

+1

Вы должны изменить формулировку своего ответа, потому что, как он читает, кажется, что вы предлагаете оба! – Pztar

2

Удалить View rootView = getLayoutInflater().inflate(R.layout.activity_login, null, false); и заменить его setContentView

public class LoginActivity extends AppCompatActivity { 

    Button btnLogin; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_login); 

     btnLogin = (Button) findViewById(R.id.btnLogin); 
     btnLogin.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       Toast.makeText(getApplicationContext(),"Button was Clicked", Toast.LENGTH_SHORT).show(); 
      } 
     }); 
    } 
} 
Смежные вопросы