如何克服这种静态与非静态方法的问题?

时间:2014-08-01 21:27:22

标签: android android-fragments

对于调试和用户信息消息,我已经使用msgbox长期VB )例程与Swing进行了广泛的对比:< / p>

  public static void msgbox(String s){
    javax.swing.JOptionPane.showMessageDialog(null, s);
  }

我刚刚开始了解Android应用开发。我在教科书中发现Toast是向用户显示信息的一种快速但又尴尬的方式。这是本书的代码:

 String selected="...whatever...";
 Toast toast=Toast.makeText(getApplicationContext(),selected,Toast.LENGTH_SHORT);
 toast.show();

所以我写了这个:

public void msgbox(String message)
{
  android.widget.Toast.makeText(getApplicationContext(),
                                message,
                                android.widget.Toast.LENGTH_SHORT)
      .show();
}

当我只有一个班级MainActivity时,我第一次使用它。然后我尝试将其与Fragment一起使用,如下所示:

public class FragmentA extends Fragment   {

    public View onCreateView(LayoutInflater 
                 inflater, ViewGroup container, Bundle savedInstanceState) {

        View v = inflater.inflate(R.layout.fragment_a, container, false);

        MainActivity.msgbox("Fragment A"); // **********************************

        Button button = (Button) v.findViewById(R.id.button1);
        //...               
        return v;
    }
}     

msgbox行上的错误为Non-static method msgbox cannot be referenced from a static context.

所以我在static的声明中添加了msgbox,这似乎是一个好主意,因为我的Swing msgbox版本的声明如下:

public static void msgbox(String message)
{
  android.widget.Toast.makeText(getApplicationContext(), // ********************
                                message,
                                android.widget.Toast.LENGTH_SHORT).show();
}

这会使原始错误消失,但它被Non-static method getApplicationContext cannot be referenced from a static context取代。

要解决 错误,我更改了msgbox的声明以包含Context

public static void msgbox(Context c, String message)
{
  android.widget.Toast.makeText(c, message, android.widget.Toast.LENGTH_SHORT)
      .show();
}

这有效并且非常有意义,但我对msgbox的快速而又脏的字符串参数调用现在已经消失了。我现在必须从msgbox ...

这样拨打main

msgbox(getApplicationContext(), "onCreate; about to show fragment A");

......并且从一个单独的类中这样:...

MainActivity.msgbox(getActivity(), "Fragment A");

我尝试将null传递给Context,该SwingJOptionDialog null pointer exception一起使用,但我得到makeText @NonNull,其第一个参数(我因此发现)被记录为getApplicationContext

我是否可以使用getActivitymakeText以外的方法作为msgbox的第一个参数,以便我static Context

或者我只需提供Swing参数就会受到影响?

另一方面,由于可以使用static执行此操作,是否有人使用makeText one-String参数的msgbox类型方法进行共享?它不必使用{{1}}。

(我挣扎了很长时间以至于觉得我和Java一样舒服.Android有点令人生畏,让我怀疑我知道的是什么......)

2 个答案:

答案 0 :(得分:1)

我还没试过这个,但是考虑继承Application,让它构建一个静态的单例对象,给它应用程序上下文。然后把你的&#39; msgbox&#39;单身人士的方法。

答案 1 :(得分:0)

在Android中,上下文是一个非常重要的概念。我建议你仔细阅读。

要回答这个问题,我强烈建议您使用该方法在片段中制作Toast。对您的上下文使用getActivity()。如果需要,可以在Utils类中创建一个静态方法,该方法将Context作为参数。然后,从您的Activity或Fragment中访问它,并分别传入this或getActivity()。