Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/417.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android无法从LoginActivity类型对非静态方法showToast(String)进行静态引用_Android_Static - Fatal编程技术网

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

Android无法从LoginActivity类型对非静态方法showToast(String)进行静态引用,android,static,Android,Static,我对android应用程序开发和java非常陌生,在尝试从另一个类调用方法时遇到以下错误: Cannot make a static reference to the non-static method showToast(String) from the type LoginActivity 我之所以想在另一个类中调用它,而不是在类本身中实例化它,是因为适应性和可升级性问题。我觉得这似乎是一个很好的概念,还是被高估了 有关守则如下: CreateAccountActivity public

我对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));
            }
        });
    }   
}
物流活动

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。

如果要以静态方式调用showToast,则必须使方法showToast为静态

public static void showToast(...)

编辑:从何处获得NullPointerException?

问题是您不应该自己从活动中创建对象。活动应该通过系统进行实例化,它们经历一个由操作系统本身管理的相当复杂的生命周期,如果不遵循正确的生命周期,它们将无法工作

有两种方法可以创建可维护的代码,这些代码可以针对您的问题实际运行:

在另一个类中的某个地方创建一个静态助手函数,并传入一个活动对象,您可以使用该对象获取布局充气器并实际显示Toast。通过这种方式,每个活动都可以使用showToast方法,而无需活动之间存在依赖关系。 创建一个基本活动,该活动由具有公共方法showToast的所有活动扩展。这样,您就不需要传递上下文方法,您的每一项活动都可以显示祝酒词。如果您要扩展不同的活动,如FragmentActivity、ListActivity、TabActivity,则会出现一些问题。
我将使用第一个方法,创建一个类似于Util或ToastUtil的类,它在一个位置为所有活动保存Toast功能。

使showToast静态不起作用,因为GetLayoutFlater提供了相同的功能,因此无法进行静态引用。。。错误Nullpointer异常与GetLayoutinFlater有关,您是否可以尝试LayoutInflater充气器=LayoutInflater.fromgetApplicationContext;而不是GetLayoutFlater?这样做了,并将findViewByIdR.id.toast\u layout\u根替换为一个变量,该变量在oncreate方法期间实例化,并传递给showToast,它可以工作!