2012-03-18 52 views
0

我有以下XML父如何访问父项中的布局项目?

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/list_places_linearLayout" > 

    <LinearLayout 
     android:id="@+id/loadingPanel" 
     style="@style/GenericProgressBackground" > 

     <ProgressBar style="@style/GenericProgressIndicator" /> 
    </LinearLayout> 

    <com.example.ListView 
     android:id="@+id/bottomactionbar" 
     style="@style/BottomActionBar" /> 

</LinearLayout> 

的com.example.ListView是包含的AsyncTask我的自定义组件。完成此任务后,我想将父级的ProgressBar可见性设置为GONE。

所以,当在的AsyncTask子组件完成,我尝试以下方法:

LinearLayout llParent = (LinearLayout)getParent(); 

((LinearLayout)llParent.findViewById(R.id.loadingPanel)).setVisibility(View.GONE); 

不幸的是,线llParent.findViewById(R.id.loadingPanel)为空...任何机会,我可以克服这个问题?

感谢, 费利佩

+0

什么是空? llParent或调用findViewById()的结果? – 2012-03-18 22:06:06

回答

3

在我看来,你想要的是一个监听器或委托方法的概括,当ListView的AsyncTask达到onPostExecute时,您的自定义ListView可以调用它。这将使您的自定义组件可重复使用(例如,如果您使用它与一个ProgressBar具有不同ID的另一个看法是什么?)

我将创建一个内部接口(com.example.ListView.AsyncTaskCompletionListener或类似)有一个方法(onAsyncTaskComplete例如),给这个类型的实例变量com.example.ListView,让Activity实现接口和方法。

在您的自定义ListView的AsyncTask的onPostExecute中,查看侦听器实例变量是否为空,然后调用其上的接口方法。

当您在活动中设置ListView时,将ListView的侦听器实例变量设置为活动(myListView.setAsyncTaskCompletionListener(this);)的实例并在侦听器方法内部,可以将ProgressBar可见性设置为GONE。

ListView的片段:

package com.example; 
public class ListView extends android.widget.ListView { 
    private AsyncTaskCompletionListener listener; 
    public AsyncTaskCompletionListener getAsyncTaskCompletionListener() { 
     return listener; 
    } 
    public void setAsyncTaskCompletionListener(AsyncTaskCompletionListener atcl) { 
     listener = atcl; 
    } 
    ... 
    public interface AsyncTaskCompletionListener { 
     public void onAsyncTaskComplete(); 
    } 
    private MyAsyncTask extends AsyncTask<Void,Void,Void> { 
     ... 
     protected void onPostExecute(Void result) { 
      if (listener != null) { 
       listener.onAsyncTaskComplete(); 
      } 
     } 
    } 
} 

你的活动片段:

public MyActivity extends android.app.Activity implements com.example.ListView.AsyncTaskCompletionListener { 
    com.example.ListView customListView; 
    ProgressBar progressBar; 
    ... 
    public void onCreate(Bundle savedInstanceState) { // Could be onResume or somewhere else 
     ... 
     progressBar = (ProgressBar)findViewById(R.id.progress_horizontal); 
     customListView = (com.example.ListView)findViewById(R.id.bottomactionbar); 
     customListView.setAsyncTaskCompletionListener(this); 
    } 
    ... 
    public void onAsyncTaskComplete() { 
     progressBar.setVisibility(View.GONE); 
    } 
} 
+0

您的建议很有效,我觉得这是对我的问题非常干净的方法。非常感谢你! – 2012-03-19 09:37:25

+0

不客气。很高兴我能帮上忙! – 2012-03-19 11:08:38

0

尽量只让你的进度条自己的ID,并直接访问它没有试图去通过其父。此外,内部的LinearLayout“loadingPanel”是不必要的。只需将你的进度条弹出到外部列表。下面是一个XML布局,包括从SDK样品的进度条的一个片段:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:orientation="vertical" 
android:layout_width="match_parent" 
android:layout_height="wrap_content"> 

<ProgressBar android:id="@+id/progress_horizontal" 
    style="?android:attr/progressBarStyleHorizontal" 
    android:layout_width="200dip" 
    android:layout_height="wrap_content" 
    android:max="100" 
    android:progress="50" 
    android:secondaryProgress="75" /> 

<TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="@string/progressbar_1_default_progress" /> 
... 

而且还尝试只使用小写字母,数字命名您的资源ID,和“_”。

+0

不知道我怎么能直接访问进度条。 这个线程的重点是如何访问孩子的父项。 谢谢 – 2012-03-19 09:38:27

1

首先,听起来像你真正想要的是ListFragment。无论您选择哪种方式,只需在ListView中为ProgressBar提供一个setter,然后在onCreate()中传递它。然后,你可以干净地直接访问你的ListView中的ProgressBar(虽然总是检查一个null)。

+0

使用Android 2.2,不允许使用ListFragment。 我不确定我了解你的建议。 谢谢 – 2012-03-19 09:22:30

+0

就像接受的答案一样,但不是提供一个监听器(这也是一个好方法),而是为列表的“进度条”提供一个setter:'customListView.setProgressBar(theProgressBar);'。 – dmon 2012-03-19 14:05:57