2017-01-29 4 views
1

안드로이드에 대한 새로운 브랜드입니다. onClickListener와 함께 사용되는 onClick 메서드의 재정의 인 onClick 메서드를 트리거해야하는 버튼이 있습니다. 문제는 버튼을 누를 때 버튼의 XML에 정의 된 onClick (MainActivity) 메서드를 찾을 수 없다는 IllegalStateException이 발생한다는 것입니다.Android 버튼 IllegalStateException onClick (MainActivity)

아래 코드는 IllegalStateException을 throw하는 코드입니다. 그러나 버튼의 XML을 android : onClick = "onClick"으로 변경하면 버튼이 제대로 작동합니다. 왜 이런거야?

버튼 XML :

<Button 
    android:text="Accept" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_below="@+id/editText2" 
    android:layout_centerHorizontal="true" 
    android:layout_marginTop="84dp" 
    android:id="@+id/button2" 
    android:onClick="onClick (MainActivity)" /> 

MainActivity 코드 : 왜이 ​​

import android.app.Activity; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.widget.TextView; 
import android.widget.Button; 
import android.widget.EditText; 



public class MainActivity extends Activity implements View.OnClickListener{ 

private TextView textView; 
private EditText username; 
private EditText password; 
private Button accept; 

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

    textView = (TextView) findViewById(R.id.textView3); 
    username = (EditText) findViewById(R.id.editText); 
    password = (EditText) findViewById(R.id.editText2); 
    accept = (Button) findViewById(R.id.button2); 
} 

public void logIn(View view) 
{ 
    Log.i("testUsername", username.getText().toString()); 
    Log.i("testPassword", password.getText().toString()); 
} 

@Override 
public void onClick(View view) 
{ 
    if((Button)view == accept) 
    { 
     Log.i("testUsername", username.getText().toString()); 
     Log.i("testPassword", password.getText().toString()); 
    } 
} 


} 
+2

가능성과 방법은 Activity 클래스에 추가되어있는 경우에만 작동합니다 작업 파일에 메소드를 추가 android hello world 프로그램에서 버튼을 클릭하면 [IllegalStateException]이 중복됩니다. (http://stackoverflow.com/questions/15433064/illegalstateexception-when-cl android-hello-world-program) –

답변

2

입니까?

android:onClick="onClick"은 올바른 구문이므로.

  • android:onClick="onClick (MainActivity)"
  • android:onClick="onClick (View)"
  • android:onClick="onClick(View)"
  • android:onClick="onClick and anything else"

the documentation for android:onClick을 인용 :

나 다음 중 어느 것도 정확한 구문없는 뷰가 클릭되었을 때에 호출하는,이 View의 문맥 내의 메소드의 이름. 이 이름은 View 유형의 매개 변수 하나만 사용하는 공용 메소드와 일치해야합니다. 예를 들어, android : onClick = "sayHello"를 지정하면 컨텍스트 (일반적으로 활동)에 대한 public void sayHello (View v) 메소드를 선언해야합니다.


확인, 트위터에 @HappyRavi의 도움으로, 나는 reproduce the problem 할 수 있었다.

  • 을 클릭

    • 는 GUI 편집기에
    • 드래그 Button에 경로에 클릭 이벤트를 원하는 메서드를 추가 그것은 당신이 특정 순서로 일을 할 경우 발생할 것 IDE의 버그 onClick 드롭 다운을 GUI 편집기의 속성 창에서

    다른 순서로 수행하면 문제가 재현되지 않습니다.

    Android Studio 2.3의 일부 패치 릴리스에서이를 해결할 수 있습니다.

  • +0

    안드로이드 스튜디오가 '(MainActivity)'를 자동으로 삽입합니까? 이것은 정확히 똑같은 잘못된 구문으로 내가 본 첫 번째 게시물이 아닙니다. –

    +0

    @MikeM .: 해당되는 경우 재현하는 데 어려움이 있습니다 (AS 2.2.3 테스트). 재현 할 방법을 찾으면 문제를 제기하고, 생각해 보면 알려주십시오. – CommonsWare

    +0

    흠. 아마도 어딘가 나쁜 예를 따르는 사용자 무리 일 수 있습니다. 체크인 주셔서 감사합니다. 그리고, 그래, 할 것이다. –

    0

    그것은 아래

    <Button 
    android:text="Accept" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_below="@+id/editText2" 
    android:layout_centerHorizontal="true" 
    android:layout_marginTop="84dp" 
    android:id="@+id/button2" 
    android:onClick="buttonClickHandler" />//name of method should be given here 
    

    과 같이 구현해야합니다 그리고

    public void buttonClickHandler(View view) { 
        //handle button click here 
    } 
    

    이것은하지 Fragment

    관련 문제