代码之家  ›  专栏  ›  技术社区  ›  Lyte

更改AsyncTask中自定义视图的可见性

  •  0
  • Lyte  · 技术社区  · 11 年前

    我正在寻找一个关于在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):位于 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.lop(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(本机方法)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(ZygoteIndit.java:862)04-02 16:04:47.016:E/AndroidRuntime(322):在 dalvik.system.NativeStart.main(本地方法)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个

    2 回复  |  直到 8 年前
        1
  •  1
  •   Drew    11 年前

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

    假设ProgressBar和MyCustomView在 您的活动布局.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不应为空(如果它们存在于xml布局文件中),并且上面的代码应该有效。

        2
  •  0
  •   sadegh saati    11 年前

    您不需要以这种方式处理可见性。如果您只需要更改可见性,只需调用您的view.setVisibility,如果您希望在自定义视图中调用override setVisibility并首先调用super.setVisibilty,那么您需要这样做。