Android无法从LoginActivity类型对静态方法showToast(String)进行静态引用

时间:2012-03-23 11:30:30

标签: android static

我对Android应用程序开发和java很新,我在尝试从另一个类调用方法时遇到以下错误:

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。

2 个答案:

答案 0 :(得分:0)

如果你想以静态方式调用showToast,你必须使方法showToast静态。

public static void showToast(...)

编辑:你在哪里得到NullPointerException?

答案 1 :(得分:0)

问题是您不应该自己创建活动对象。活动应该通过系统实例化,它们经历一个由操作系统本身管理的相当复杂的生命周期,如果它们没有遵循正确的生命周期就不会起作用。

创建可实际运行的可维护代码有两种可能性:

  1. 在另一个类的某处创建一个静态辅助函数,并传入一个用于获取布局inflater并实际显示Toast的活动对象。这样,每个活动都可以使用showToast方法,而不会在您的活动之间存在依赖关系。
  2. 创建一个基本活动,该活动由具有公共方法showToast的所有活动扩展。这样您就不需要传递上下文方法,并且您的每个活动都只能显示Toast。如果要扩展FragmentActivity,ListActivity,TabActivity等不同的活动,则会出现一些问题。
  3. 我会使用第一种方法创建类似于Util或ToastUtil类的东西,它在所有活动的一个地方保存Toast功能。