2016-09-08 10 views
-3

私のAndroidアプリケーションでエラーが発生しました。 pauseBでsetVisible()を呼び出すと、pauseBがnullに初期化されるため、アプリケーションがクラッシュします。 startBでsetVisible()を呼び出すとうまく動作するので、奇妙です。Button.setVisibilityクラッシュAndroidアプリケーション

...imports... 

public class MainActivity extends AppCompatActivity { 

public static boolean toggle=false; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
} 

public void beginGame(View v) 
{ 
    Button startB= (Button)v.findViewById(R.id.startButton); 
    startB.setVisibility(View.GONE); 

    Button pauseB = (Button)v.findViewById(R.id.pauseButton); 
    pauseB.setVisibility(View.VISIBLE); 

    rest of method... 
} 

rest of code... 
} 

ここactivity_main.xml

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    tools:context="com.placemultiplebuttons_android_examples.com.MainActivity" > 

    <Button 
     android:id="@+id/startButton" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentTop="true" 
     android:text="Start!" 
     android:onClick="beginGame" /> 

    <Button 
     android:id="@+id/pauseButton" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignBaseline="@+id/startButton" 
     android:layout_alignBottom="@+id/startButton" 
     android:layout_toRightOf="@+id/startButton" 
     android:text="Pause" 
     android:onClick="pauseGame" /> 


</RelativeLayout> 

がAndroidStudioによって与えられる例外で

MainActivity.java:ここに関連するコードである

例外

FATAL EXCEPTION: main 
                       Process: com.example.jackson.myfirstapp, PID: 2285 
                       java.lang.IllegalStateException: Could not execute method for android:onClick 
                        at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:293) 
                        at android.view.View.performClick(View.java:5198) 
                        at android.view.View$PerformClick.run(View.java:21147) 
                        at android.os.Handler.handleCallback(Handler.java:739) 
                        at android.os.Handler.dispatchMessage(Handler.java:95) 
                        at android.os.Looper.loop(Looper.java:148) 
                        at android.app.ActivityThread.main(ActivityThread.java:5417) 
                        at java.lang.reflect.Method.invoke(Native Method) 
                        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
                        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
                       Caused by: java.lang.reflect.InvocationTargetException 
                        at java.lang.reflect.Method.invoke(Native Method) 
                        at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:288) 
                        at android.view.View.performClick(View.java:5198)  
                        at android.view.View$PerformClick.run(View.java:21147)  
                        at android.os.Handler.handleCallback(Handler.java:739)  
                        at android.os.Handler.dispatchMessage(Handler.java:95)  
                        at android.os.Looper.loop(Looper.java:148)  
                        at android.app.ActivityThread.main(ActivityThread.java:5417)  
                        at java.lang.reflect.Method.invoke(Native Method)  
                        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)  
                        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)  
                       Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.Button.setVisibility(int)' on a null object reference 
                        at com.example.jackson.myfirstapp.MainActivity.beginGame(MainActivity.java:29) 
                        at java.lang.reflect.Method.invoke(Native Method)  
                        at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:288)  
                        at android.view.View.performClick(View.java:5198)  
                        at android.view.View$PerformClick.run(View.java:21147)  
                        at android.os.Handler.handleCallback(Handler.java:739)  
                        at android.os.Handler.dispatchMessage(Handler.java:95)  
                        at android.os.Looper.loop(Looper.java:148)  
                        at android.app.ActivityThread.main(ActivityThread.java:5417)  
                        at java.lang.reflect.Method.invoke(Native Method)  
                        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)  
                        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)  

問題を修正再表示は、エラーが、私はそれを把握することはできません、私の人生のためにライン

pauseB.setVisibility(View.VISIBLE); 

に起こります。私がAndroidの初心者であるので、ここでの助けに感謝します。あなたのお時間をありがとうございました!

+0

コードサンプルには 'pauseGame(View v){}'はありません。 – Enzokie

+0

彼はコードで 'pauseGame'メソッドを提供していませんが(これは別のエラーを与えるでしょう)、私はそれが良い初心者の質問と一般的な間違いの一つだと思う。 '-3'がなぜそれに投票したのか、ほとんど理解できていない。厳しすぎ。 – Youngjae

答えて

0

理由は、

  1. クリックstartButtonbeginGameメソッドを実行しています。
  2. beginGameメソッドのvには、startButtonボタンビューがあります。
  3. あなたのButton pauseB = (Button)v.findViewById(R.id.pauseButton);ポイントR.id.pauseButtonの中にstartButtonボタンビューがあります。
  4. startButtonpauseButtonが含まれていないため、クラッシュが発生しました。 pauseButtonビューは、ビューのR.layout.activity_mainではありません。

これを修正するには、ボタン変数をグローバルに宣言し、setContentViewの後にonCreateに定義します。

Button startB = null; 
Button pauseB = null; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    startB = (Button) findViewById(R.id.startButton); 
    pauseB = (Button) findViewById(R.id.pauseButton); 
} 

public void beginGame(View v) 
{ 
    startB.setVisibility(View.GONE); 
    pauseB.setVisibility(View.VISIBLE); 

    // rest of method... 
} 
+0

うわー!迅速で効果的な対応をありがとう。これは固定され、ケースが閉じられました! –

+0

@JacksonHoagland //幸せなコーディング:) – Youngjae

0

v.findViewById(...)の代わりにfindViewById(...)を試してください。あなたがクラッシュを得た理由

関連する問題