【问题标题】:No enclosing instance of type ContactsXmpp is accessible?无法访问 ContactsXmpp 类型的封闭实例?
【发布时间】:2013-01-01 05:18:24
【问题描述】:

这是我正在使用的课程

public class ContactsXmpp extends SherlockFragmentActivity {

private static Context ctx;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.contacts_xmpp_sip);

    ctx = this;
}   

当我从此方法调用 asynctask 时出现错误。这是错误 No enclosing instance of type ContactsXmpp is accessible. Must qualify the allocation with an enclosing instance of type ContactsXmpp (e.g. x.new A() where x is an instance of ContactsXmpp).

private static void alert( String str, final String name ) {

    AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(ctx);       
    alertDialogBuilder.setMessage(str + ": " + name);
    alertDialogBuilder.setCancelable(false)
    .setPositiveButton("Yes",new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog,int id) {                 
            Subscription(name);          
            new ColorsXMPP_AfterLogin().execute();     ///** error getting here..                                
        }
    }); 

    alertDialogBuilder.setNegativeButton("No", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            unSubscribe(name);
        }           
    });

    AlertDialog alertDialog = alertDialogBuilder.create();       
    alertDialog.show();         
}    

这里是异步任务

public class ColorsXMPP_AfterLogin extends AsyncTask<AfterLogging, Void, Void> {

    private ProgressDialog _dialog;

    @Override
    protected void onPreExecute() {          
        super.onPreExecute();            
        Log.e(TAG, " GmailXMPP_AfterLogin onPreExecute" );
    }

    @Override
    protected void onPostExecute(Void feed) {
        //ProgressBar_hide();       
        _dialog.dismiss();
        Log.e(TAG, " GmailXMPP_AfterLogin onPostExecute" );        
    }

    @Override
    protected Void doInBackground(AfterLogging... arg0) {

        Log.e(TAG, " GmailXMPP_AfterLogin doInBackground" );

        return null;
    }
 }

【问题讨论】:

  • 在调用 alert` 方法之前,确保在 onCreate 的 onCreate 方法中将 Activity 上下文分配给 ctx
  • 是的,我做对了,我只在 onCreate() 方法中分配了。更新了我的代码看看那个。
  • new ColorsXMPP_AfterLogin().execute(ContactsXmpp.this);试试这个,我想帮助这个..

标签: android syntax-error static-methods


【解决方案1】:

您不能在alert 的static 方法中实例化ColorsXMPP_AfterLogin 类(我假设两者都在ContactsXmpp 活动中)。问题是ColorsXMPP_AfterLogin 被声明为 inner class 并且内部类需要创建封闭类的实例(它们需要此连接)。在静态 alert 方法中,您没有此实例,因此编译器会抛出该错误。你有几个选项来解决这个问题,我推荐的一个是将ColorsXMPP_AfterLogin 作为ContactsXmpp 中的一个嵌套类(声明为public static class ColorsXMPP_AfterLogin...),或者将它完全移动到它自己的java文件中(如果你需要一个与Activity 的Context 的连接只需在AsyncTask 的构造函数中传递对ctx 的引用)。

您还可以使用ctx 变量来创建ColorsXMPP_AfterLogin 的实例,例如:

ctx.new ColorsXMPP_AfterLogin();

【讨论】:

    猜你喜欢
    • 2011-12-15
    • 2016-11-20
    • 2013-04-11
    • 2012-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 2013-02-17
    相关资源
    最近更新 更多