2017-09-30 3 views
2

에서 버튼의 onclick을 생성 버튼 프로그래밍 Navigation.java 만들어집니다. 초기 메뉴 nav.mainMenu()이 올바르게 호출되고 버튼이 예상대로 생성됩니다. 내 문제는 버튼을 클릭해도 아무 일도 일어나지 않는다는 것입니다.안드로이드 프로그래밍 내가 MainActivity.java</strong><strong>에 <code>onClick</code> 스위치 방식이 클래스

logcat에 오류 스택 추적이 없습니다. onclick 메서드에 로그를 저장하려고 시도했지만 멀리는 얻을 수 없습니다. 에뮬레이터가 작동하는 것처럼 보이며 멈추거나 충돌하지 않습니다.

코드를 메뉴로 보내면 해당 클래스에 활동이 있다고 가정합니까? 그래서 MainActivityonClickListener을 사용하려고하면 인식하지 못합니까?

v.getId()에서 무엇을 기대해야하는지 확실하지 않습니다. MainActivity.javaR.id.btnGame?

MainActivity.java

public class MainActivity extends Activity implements View.OnClickListener { 

    public Navigation nav = new Navigation(this); 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.empty); 
    nav.mainMenu(); 
    } 

    @Override 
    public void onClick(View v) { 
    switch(v.getId()) { 
     case R.id.btnGame: 
     nav.game(); 
     break; 
    } 
    } 
} 

Navigation.java

public class Navigation { 

    Button btnGame; 

    Context mContext; 
    Navigation(Context mContext) { 
    this.mContext = mContext; 
    } 

    public void mainMenu() { 
    LinearLayout ll = new LinearLayout(mContext); 
    ll.removeAllViews(); 
    LinearLayout.LayoutParams llP = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT); 
    ll.setLayoutParams(llP); 
    ll.setOrientation(LinearLayout.VERTICAL); 
    LinearLayout.LayoutParams btnParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT); 

    btnGame = new Button(mContext.getApplicationContext()); 
    btnGame.setLayoutParams(btnParams); 
    btnGame.setText("Play Game"); 
    ll.addView(btnGame); 

    Activity activity = (Activity) mContext; 
    activity.setContentView(ll); 
    } 

    public void game() { 
    Toast.makeText(mContext, "I dont see this", Toast.LENGTH_SHORT).show(); 
    } 
} 
  • 내가 Navigation.java에있는 버튼을 .setOnClickListener()를 추가하는 시도했지만 난 못해 문맥의 권리를 얻는다면, 나는 그것이 무엇인지 알지 못한다. 누락.

  • 내비게이션 MainActivity 또는 Activity에 Navigation.java을 입력하면 오류가 발생합니다. 응용 프로그램 후

로그 캣은 에뮬레이터에 내장되었습니다

09-30 17:43:59.655 7038-7038/? I/art: Not late-enabling -Xcheck:jni (already on) 
09-30 17:43:59.655 7038-7038/? W/art: Unexpected CPU variant for X86 using defaults: x86 
09-30 17:43:59.854 7038-7038/com.fomtirth.barcodebattle W/System: ClassLoader referenced unknown path: /data/app/com.fomtirth.barcodebattle-2/lib/x86 
09-30 17:43:59.867 7038-7038/com.fomtirth.barcodebattle I/InstantRun: starting instant run server: is main process 
09-30 17:44:00.230 7038-7066/com.fomtirth.barcodebattle I/OpenGLRenderer: Initialized EGL, version 1.4 
09-30 17:44:00.230 7038-7066/com.fomtirth.barcodebattle D/OpenGLRenderer: Swap behavior 1 
09-30 17:44:00.230 7038-7066/com.fomtirth.barcodebattle W/OpenGLRenderer: Failed to choose config with EGL_SWAP_BEHAVIOR_PRESERVED, retrying without... 
09-30 17:44:00.230 7038-7066/com.fomtirth.barcodebattle D/OpenGLRenderer: Swap behavior 0 
09-30 17:44:00.234 7038-7066/com.fomtirth.barcodebattle D/EGL_emulation: eglCreateContext: 0x9baa38c0: maj 2 min 0 rcv 2 
09-30 17:44:00.241 7038-7066/com.fomtirth.barcodebattle D/EGL_emulation: eglMakeCurrent: 0x9baa38c0: ver 2 0 (tinfo 0x99a887d0) 
09-30 17:44:00.293 7038-7066/com.fomtirth.barcodebattle D/EGL_emulation: eglMakeCurrent: 0x9baa38c0: ver 2 0 (tinfo 0x99a887d0) 
09-30 17:44:00.400 7038-7066/com.fomtirth.barcodebattle D/EGL_emulation: eglMakeCurrent: 0x9baa38c0: ver 2 0 (tinfo 0x99a887d0) 
09-30 17:44:00.460 7038-7066/com.fomtirth.barcodebattle D/EGL_emulation: eglMakeCurrent: 0x9baa38c0: ver 2 0 (tinfo 0x99a887d0) 
+1

어떤 오류가 있습니까? 그들을 보여줄 수 있습니까? –

+0

오류가 발생하지 않습니다. logcat은 빌드 후에 비어 있습니다. 위에서 빌드 출력을 포함하도록 편집합니다. – TomFirth

+0

오류를 걸러 냈습니까? –

답변

2

당신은 필드에서 컨텍스트를 할당 할 수 없습니다. 실제로는 nullpointerexception을 얻고 잘못된 위치를 편집하기 때문에 "권리를 할당 할 수 없습니다". 즉, getApplicationContext()은 필요하지 않습니다.

또한 컨텍스트를 작업에 캐스팅하지 않고 콘텐츠 레이아웃을 반환하는 것이 좋습니다.

public Navigation nav; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    nav = new Navigation(this); 
    setContentView(nav.mainMenu()); 

} 

@Override 
public void onClick(View v) { 
    switch(v.getId()) { 
    case R.id.btnGame: 
     nav.game(); 
     break; 
    } 
} 

언뜻보기에 버튼에 클릭 리스너를 설정하지 않았 음을 알 수 있습니다. 아마 그렇게해야합니다. 예를 들어

이제

Context mContext; 
View.OnClickListener mClickListener; 

Navigation(Context context) { 
    this.mContext = context; 
    if (context instanceof View.OnClickListener) { 
     this.mClickListener = (View.OnClickListener) context ; 
    } 
} 

if (mClickListener!=null) { 
    button.setOnClickListener(mClickListener); 
} 

나는 또한 내가 MainActivity.java R.id.에 v.getId()에서 기대해야 모르겠어요 사용 btn 게임?

ID가 변수 이름과 일치하지 않습니다. 단추에 ID를 명시 적으로 지정하지 않으면 -1

+0

클래스 정의를 onCreate 메소드로 이동하려고 시도했지만 생각하지 않았습니다. 초기 메뉴 호출이 아직 이루어 졌기 때문에 문제가되었습니다. 나는 그것을 옮기고 아무런 차이를 보지 못했다. getApplicationContext()를 제거했습니다. 이제는 'btnGame = new Button (mContext);'으로 남겨 두었습니다. 나는 이것으로부터 응답을 얻지 못한다. – TomFirth

+0

그것은 훌륭합니다. 버튼에'clickListener'를 추가하는 방법을 찾지 못했습니다! – TomFirth

+1

청취자는 필요할 때마다 구현할 수 있습니다. 또한 Navigation 클래스에 setOnClickListener 메소드를 추가 할 수 있습니다. –

관련 문제