【问题标题】:Changing visibility of custom view within an AsyncTask更改 AsyncTask 中自定义视图的可见性
【发布时间】:2014-04-02 13:01:31
【问题描述】:

我正在寻找在 AsyncTask 中更改自定义视图可见性的解决方案。我读过这个:

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

但这对我没有帮助,因为我不知道如何处理接口。我已经把它放在我的自定义视图类中,但是我在哪里注册监听器?在我有 AsyncTask 的 Activity 中?那么onSetVisibilityCalled()这个方法应该怎么做呢?

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

代码sn-p:

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()-Method 中出现以下错误:

04-02 16:04:47.016: E/AndroidRuntime(322): 致命异常: main 04-02 16:04:47.016: E/AndroidRuntime(322): java.lang.RuntimeException: 无法开始活动 组件信息{com.example.test/com.example.test.MyActivity}: java.lang.NullPointerException 04-02 16:04:47.016: E/AndroidRuntime(322):在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2295) 04-02 16:04:47.016: E/AndroidRuntime(322): 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2349) 04-02 16:04:47.016: E/AndroidRuntime(322): 在 android.app.ActivityThread.access$700(ActivityThread.java:159) 04-02 16:04:47.016:E/AndroidRuntime(322):在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1316) 04-02 16:04:47.016: E/AndroidRuntime(322): 在 android.os.Handler.dispatchMessage(Handler.java:99) 04-02 16:04:47.016:E/AndroidRuntime(322):在 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):在 java.lang.reflect.Method.invokeNative(Native Method) 04-02 16:04:47.016:E/AndroidRuntime(322):在 java.lang.reflect.Method.invoke(Method.java:525) 04-02 16:04:47.016: E/AndroidRuntime(322):在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1046) 04-02 16:04:47.016: E/AndroidRuntime(322): 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:862) 04-02 16:04:47.016:E/AndroidRuntime(322):在 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):在 com.example.test.MyActivity$FetchLocationTask.onPreExecute(MyActivity.java:55) 04-02 16:04:47.016: E/AndroidRuntime(322): 在 android.os.AsyncTask.executeOnExecutor(AsyncTask.java:586) 04-02 16:04:47.016:E/AndroidRuntime(322):在 android.os.AsyncTask.execute(AsyncTask.java:534) 04-02 16:04:47.016: E/AndroidRuntime(322):在 com.example.test.MyActivity.onCreate(MyActivity.java:32) 04-02 16:04:47.016:E/AndroidRuntime(322):在 android.app.Activity.performCreate(Activity.java:5372) 04-02 16:04:47.016:E/AndroidRuntime(322):在 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 更多

【问题讨论】:

  • 只需取消注释onPreExecute()onPostExecute() 中的myCustomView.setVisibility(..) 行。那应该可以。
  • 我做到了,并使用 LogCat 中显示的错误编辑了我的问题。我希望他们能告诉你一些事情。
  • 是的,他们做到了。检查答案

标签: android android-asynctask android-custom-view


【解决方案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);
    ...
}

现在你的两个Views 都应该不为空(如果它们存在于 xml 布局文件中),并且上面的代码应该可以工作。

【讨论】:

  • 哇,我很抱歉...我忘了在代码 sn-p 中输入这两行。我有它们,错误是一样的。 ://
  • 可能是因为在 Android 中创建活动/视图的顺序?当我尝试更改可见性时,视图可能不存在。
  • 它们绝对不存在,这就是我的回答所指向的。特别是,如果您的真实代码与您在帖子中提供的代码相同,那么错误的来源就是您的 ProgressBar。仔细检查您提供给 findViewById 的 id 和 xml 文件中指定的 id。如果你在Activity中有R.id.myProgressBar,那么在XML中你应该有一个标签:&lt;ProgressBar android:id="@+id/myProgressBar" ...&gt;
  • 如果 ID 正确,请再次尝试清理和构建您的项目 - 只是为了确保 R.java 包含所有必要的 ID。
  • 感谢您的帮助!我设法修复它...... id 都是正确的!我现在创建了一个公共静态类,其中包含一些用于收集数据的属性和一个布尔值。如果我的计算完成,我会隐藏 ProgressBar 并绘制所有内容。如果它们没有完成(我在 onDraw() 中检查它),我只需调用 invalidate()。我没有为我的问题找到任何解决方案,所以我使用它,直到我找到更好的东西。我认为我的解决方案不是很好......有太多不必要的 invalidate() 调用。 :(
【解决方案2】:

您不需要以这种方式处理可见性。如果您只需要更改可见性,只需调用 yourview.setVisibility 并且如果您想知道这是否在您的自定义视图中调用了覆盖 setVisibility 并首先调用 super.setVisibilty确实想要你需要做的。

【讨论】:

  • 我有点困惑。我是如何改变我的 AsyncTask 中 ProgressBar 的可见性的?我在 Activity 的 onCreate() 中初始化了 ProgressBar,后来在 AsyncTask 中,我改变了可见性。
  • 如果您在 onCreate 中对其进行了初始化,那么将其传递给您的 AsyncTask 然后您可以在那里更改可见性。你可以发布你所做的,然后我会帮助你。
  • @mohammadsadeghsaati 你的答案完全错误AsyncTask 不会一直在单独的线程上运行。例如,方法 onPostExecuteonPreExecute在 UI 线程上调用。您应该修改或删除您的帖子,以免混淆 android 学生。
  • 根据堆栈跟踪,您的问题是 NullPointerException。代码没有问题。
  • 所有 id 都是正确的。 :/我尝试了一些新的东西......我在我的活动中创建了一个视图的引用,并在我的 AsyncTask 中创建了一个视图的引用。 AsyncTask的构造函数用Activity中View的引用来初始化他对View的引用。然后我尝试在我的 onPostExecute() 方法中的引用上调用 postInvalidate(),但我仍然得到 NullPointerException。
猜你喜欢
  • 1970-01-01
  • 2016-09-18
  • 2014-07-04
  • 2012-11-26
  • 1970-01-01
  • 1970-01-01
  • 2013-04-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多