2012-03-18 2 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으로 설정하려고합니다.

LinearLayout llParent = (LinearLayout)getParent(); 

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

불행하게도 라인 llParent.findViewById (R.id.loadingPanel가) 널 (null)입니다 ... 어떤 기회가 내가 이것을 극복 할 수 AsyncTask를이 하위 구성 요소에서 수행 될 때

그래서, 나는 다음과 같은 시도 발행물?

감사합니다, 펠리페

+0

널 (null) 무엇인가? llParent 또는 findViewById()를 호출 한 결과? –

답변

3

ListView의 AsyncTask가 onPostExecute에 도달 할 때 사용자 지정 ListView에서 호출 할 수있는 수신기 또는 대리자 메서드가 일반화 된 것처럼 보입니다. 즉, 사용자 정의 컴포넌트 재사용 할 것 (다른 ID를 가진 ProgressBar와 다른보기에서 사용할 경우 어떻게 예를?)

내가 하나의 방법으로 내부 인터페이스 (com.example.ListView.AsyncTaskCompletionListener 또는 일부 등)를 만들 것이다 (onAsyncTaskComplete를 예를 들어, com.example.ListView에 해당 유형의 인스턴스 변수를 지정하고 Activity가 인터페이스와 메소드를 구현하게하십시오.

사용자 지정 ListView의 AsyncTask 중 onPostExecute에서 listener 인스턴스 변수가 null이 아닌지 확인한 다음 해당 인터페이스 메서드를 호출하십시오.

Activity에서 ListView를 설정할 때 ListView의 수신기 인스턴스 변수를 Activity 인스턴스 (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

귀하의 제안은 훌륭하게 작동하며 제 문제에 대한 매우 청결한 접근 방법입니다. 고마워요! –

+0

당신을 진심으로 환영합니다. 다행스럽게 도울 수있어! –

0

그냥 직접 부모를 통과하려고 노력없이 진행 표시 줄이 자신의 ID 및 액세스를 제공하려고합니다. 또한, 내부 LinearLayout "loadingPanel"은 불필요합니다. 진행률 표시 줄을 바깥 쪽 목록으로 팝하십시오. 여기에 SDK 샘플에서 진행 표시 줄을 포함한 XML 레이아웃의 코드 조각입니다 :

<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

진행률 막대에 어떻게 직접 액세스 할 수 있는지 잘 모르겠습니다. 이 스레드의 핵심은 하위 항목에서 상위 항목에 액세스하는 방법이었습니다. 감사합니다. –

1

우선, 실제로 원하는 소리는 ListFragment입니다. ProvenBar의 ListView에 setter를 제공하고 onCreate()에 전달하면됩니다. 그런 다음 ListView의 ProgressBar에 직접 액세스 할 수 있습니다 (단, null은 항상 확인합니다).

+0

Android 2.2를 사용하면 ListFragment를 사용할 수 없습니다. 나는 당신이 제안한 것을 이해했는지 확신 할 수 없다. 감사합니다 –

+0

그냥 받아 들인 대답과 같지만 청취자를 제공하는 대신 좋은 접근법입니다. 목록의 "진행 표시 줄"에 대한 설정자 인 customListView.setProgressBar (theProgressBar);를 제공합니다. – dmon

관련 문제