2014-04-02 41 views
0

我正在寻找一个解决方案,以更改AsyncTask中的自定义视图的可见性。我已阅读本:在AsyncTask中更改自定义视图的可见性

How to handle visibility changes for a custom android view/widget

但它并不能帮助我,因为我不明白如何处理接口。我已经把它放在我的自定义视图类中,但我在哪里注册监听器?在我有我的AsyncTask的活动中?那么onSetVisibilityCalled()方法应该怎么做?

我希望你能帮助我,我感谢你的帮助。

代码片断:

public Class MyActivity extends Activity{ 

private ProgressBar myProgressBar; 
private MyCustomView myCustomView; 
private MyTask myTask; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 

super(savedInstanceState); 
    setContentView(R.layout.my_activity_layout.xml); 
myProgressBar = (ProgressBar) findViewById(R.id.myProgressBar); 
myCustomView = (MyCustomView) findViewById(R.id.myCustomView); 
myTask = new MyTask(); 
myTask.execute(); 
} 


private class MyTask extends AsyncTask<Void, Void, Void>{ 
protected void onPreExecute(){ 
myProgressBar.setVisibility(View.VISIBLE); 

// Here I would like to change the visibility of my Custom View to GONE 
// myCustomView.setVisibility(View.GONE); 
} 

@Override 
protected void doInBackground(Void... params){ 
//... do something 
} 

protected void onPostExecute(){ 
myProgressBar.setVisibility(View.GONE); 
// Here I would like to change the visibility of my Custom View to VISIBLE 
// myCustomView.setVisibility(View.VISIBLE); 
} 
} 
} 

如果我去掉myCustomView.setVisibility(View.GONE);在onPreExecute() - 方法我收到以下错误:

04-02 16:04:47.016:E/AndroidRuntime(322):致命异常:主要04-02 16:04:47.016:E/AndroidRuntime(322):java.lang.RuntimeException: 无法启动活动 ComponentInfo {com.example.test/com.example.test.MyActivity}: java.lang.NullPointerException 04-02 16:04:47.016: E/AndroidRuntime(322):at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2295) 04-02 16:04:47.016:E/AndroidRuntime(322):at android.app.ActivityThread.handleLaunchActivity( ActivityThread.java:2349) 04-02 16:04:47.016:E/AndroidRuntime(322):at android.app.ActivityThread.access $ 700(ActivityThread.java:159)04-02 16:04:47.016:E/AndroidRuntime(322) :at android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1316) 04-02 16:04:47.016:E/AndroidRuntime(322):at android.os.Handler.dispatchMessage(Handler.java: 99)04-02 16:04:47.016:E/AndroidRuntime(322):at android.os.Looper.loop(Looper.java:176)04-02 16:04:47.016: E/AndroidRuntime(322) ): android.app.ActivityThread.main(ActivityThread.java:5419)04-02 16:04:47.016:E/AndroidRuntime(322):at java.lang.reflect.Method.invokeNative(Native Method) 04-02E/AndroidRuntime(322):at16:04:47.016:E/AndroidRuntime(322):at java.lang.reflect.Method.invoke(Method.java:525)04-02 16:04:47.016: (0)收起该表格展开该表格main(ZygoteInit.java:862)04-02 16:04:47.016:E/AndroidRuntime(322):at dalvik.system.NativeStart.main(Native Method)04-02 16:04:47.016: E/AndroidRuntime(322):导致:java.lang.NullPointerException 04-02 16:04:47.016:E/AndroidRuntime(322):at com.example.test.MyActivity $ FetchLocationTask.onPreExecute(MyActivity.java:55) 04-02 16 :04:47.016:E/AndroidRuntime(322):at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:586)04-02 16:04:47.016:E/AndroidRuntime(322):at android.os .AsyncTask.execute(AsyncTask.java:534)04-02 16:04:47.016: E/AndroidRuntime(322):at com.example.test.MyActivity.onCreate(MyActivity.java:32)04-02 16:04:47.016:E/AndroidRuntime(322):at android.app.Activity.performCreate(Activity。java:5372)04-02 16:04:47.016:E/AndroidRuntime(322):at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1104) 04-02 16:04:47.016:E/AndroidRuntime (322):在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2257) 04-02 16:04:47.016:E/AndroidRuntime(322):11 ...更多

+0

只需在'onPreExecute()'和'onPostExecute()'中取消'myCustomView.setVisibility(..)'行的注释。这应该工作。 – Drew

+0

我做到了,我编辑了我的问题,并在我的LogCat中显示错误。我希望他们告诉你一些事情。 – Lyte

+0

是的,他们做到了。检查答案 – Drew

回答

1

您的问题不在AsyncTask中。 在你的onCreate(Bundle)方法中,你没有setContentView(int)

假设您的ProgressBar和MyCustomView在your_activity_layout.xml资源文件中定义,您应该添加一行:setContentView(R.layout.your_activity_layout.xml)

添加它只调用super(Bundle)构造(您忘记添加它太)后:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super(savedInstanceState);//you forgot that 
    setContentView(R.layout.your_activity_layout.xml);//and that 
    myProgressBar = (ProgressBar) findViewById(R.id.myProgressBar); 
    myCustomView = (MyCustomView) findViewById(R.id.myCustomView); 
    ... 
} 

现在两个您View S的不应NULL(如果呈现XML布局文件)并且上面的代码应该可以工作。

+0

哇,我很抱歉...我忘了把这两行代码片段放在这里。我有他们,错误是一样的。 :/ – Lyte

+0

难道这是因为订单活动/视图是在Android中创建的吗?当我尝试更改可见性时,可能视图不存在。 – Lyte

+0

他们肯定不存在,这就是我的答案指出的。特别是,如果您的真实代码与您在帖子中提供的代码相同,那么错误的来源是您的ProgressBar。仔细检查你提供给'findViewById'的id和xml文件中指定的id。如果在Activity中有'R.id.myProgressBar',那么在XML中你应该有一个标签:'' – Drew

0

你做不需要以这种方式处理可见性。如果您只需要更改可见性,只需调用yourview.setVisibility,并且如果要在此自定义视图中覆盖setVisibility并在第一次调用super.setVisibilty时通知它,则希望您需要做。

+0

我有点困惑。我如何更改AsyncTask中ProgressBar的可见性?我在Activity的onCreate()中初始化了ProgressBar,后来在AsyncTask中更改了可见性。 – Lyte

+0

如果你在onCreate中初始化它,所以把它传递给你的AsyncTask,那么你可以改变它的可见性。你可以发布你已经完成的,然后我会帮你。 –

+0

我编辑了我的帖子,非常感谢! – Lyte

相关问题