2012-03-23 21 views
0

私はAndroidアプリケーション開発とJavaにはかなり新しく、別のクラスのメソッドを呼び出すときに次のエラーが発生しました:Android LoginActivityタイプから非静的メソッドshowToast(String)への静的参照を作成できません

Cannot make a static reference to the non-static method showToast(String) from the type LoginActivity 

私は他のクラスでこれを呼び出し、クラス自体でそれをインスタンス化しないようにしたい理由は、適応性とアップグレードの問題です。これは私の素晴らしいコンセプトか、過大評価されているのでしょうか?

CreateAccountActivity

public class NewAccountActivity extends Activity{ 

private Button mCreateAccountButton; 

@Override 
public void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 

    setContentView(R.layout.newaccount); 

    mCreateAccountButton = (Button) findViewById(R.id.createaccount_button); 

    registerButtonListeners(); 

    } 

    private void registerButtonListeners() { 
     mCreateAccountButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       LoginActivity.showToast(getString(R.string.createaccount_message)); 
      } 
     }); 
    } 
} 

LoginActivity

public void showToast(String toastString) { 
    LayoutInflater inflater = getLayoutInflater(); 
    View layout = inflater.inflate(R.layout.toast_layout, (ViewGroup) findViewById(R.id.toast_layout_root)); 

    ImageView image = (ImageView) layout.findViewById(R.id.toastImage); 
    image.setImageResource(R.drawable.android); 

    TextView text = (TextView) layout.findViewById(R.id.toastText); 
    text.setText(toastString); 

    Toast toast = new Toast(getApplicationContext()); 
    toast.setGravity(Gravity.CENTER_VERTICAL, 0, 0); 
    toast.setDuration(Toast.LENGTH_SHORT); 
    toast.setView(layout); 
    toast.show(); 
} 

それはエラーメッセージが離れて行かせる上で新しいLoginActivityオブジェクトを作成し、その後showToastを呼び出すことが、私与える:

関連するコードです代わりにNullPointerExceptionが発生します。

答えて

0

静的な方法でshowToastを呼び出す場合は、showToastメソッドを静的にする必要があります。

public static void showToast(...) 

編集:どこでNullPointerExceptionを取得しますか?

+0

getLayoutInflaterが同じ「静的参照を作成できません...」というエラーが発生したため、showToast staticは機能しません。 Nullpointer例外は、getLayoutInflaterを使用しています。 –

+0

LayoutInflater inflater = LayoutInflater.from(getApplicationContext())を試してください。代わりにgetLayoutInflater(); ? – Blackbelt

+1

これを実行し、findViewById(R.id.toast_layout_root)をoncreateメソッドでインスタンス化され、showToastに渡された変数で置き換えました。 –

0

問題は、自分自身でアクティビティからオブジェクトを作成すべきではないということです。アクティビティはシステムを通じてインスタンス化する必要があり、OS自体によって管理されるかなり複雑なライフサイクルを経て、ライフサイクルが正しくない場合は機能しません。

実際にあなたの問題のために実行される保守性のコードを作成するには、2つの可能性があります。

  1. が別のクラスのどこかに静的ヘルパー関数を作成し、実際にあなたがレイアウトインフレータを取得するために使用している活動オブジェクトを渡すと、トーストを見せてください。このように、すべてのアクティビティは、アクティビティ間の依存関係なしにshowToastメソッドを使用できます。
  2. パブリックメソッドshowToastを持つすべてのアクティビティによって拡張される基本アクティビティを作成します。この方法では、コンテキストメソッドを渡す必要はなく、すべてのアクティビティでトーストを表示することができます。これは、FragmentActivity、ListActivity、TabActivityのような異なるアクティビティを拡張する場合、いくつかの問題があります。

私は、最初のメソッドを使って、Toast機能をすべてのアクティビティの1か所に保持するUtilまたはToastUtilクラスのようなものを作成します。

関連する問題