Android 如何从子级访问父级中的布局项?
我有以下父xmlAndroid 如何从子级访问父级中的布局项?,android,android-layout,Android,Android Layout,我有以下父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" >
<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>
不幸的是,行llParent.findviewbyd(R.id.loadingPanel)为空。。。我有没有可能克服这个问题
谢谢,
Felipe尝试只给进度条提供自己的id,直接访问进度条,而不必通过它的父级。此外,不需要内衬布局“装载面板”。只需将进度条弹出到外部列表。下面是一个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" />
...
...
此外,请尝试仅使用小写字母、数字和“u”来命名资源ID。尝试只为进度条提供自己的ID,并直接访问进度条,而不尝试通过其父级。此外,不需要内衬布局“装载面板”。只需将进度条弹出到外部列表。下面是一个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" />
...
...
另外,请尝试仅使用小写字母、数字和“u”来命名资源ID。首先,听起来您真正想要的是一个
列表片段。无论您选择哪种方式,只需在ListView中为ProgressBar提供一个setter,并将其传递到onCreate()
中即可。然后,您可以直接干净地访问ListView中的ProgressBar
(但始终检查空值)。首先,听起来您真正想要的是一个ListFragment
。无论您选择哪种方式,只需在ListView中为ProgressBar提供一个setter,并将其传递到onCreate()
中即可。然后,您可以直接干净地访问ListView中的ProgressBar
(但始终检查空值)。在我看来,您想要的是一个监听器或委托方法,您的自定义ListView可以在ListView的AsyncTask到达onPostExecute
时调用该方法。这将使您的自定义组件可重用(例如,如果您在另一个具有不同id的ProgressBar
视图上使用它会怎么样?)
我将使用单个方法(onAsyncTaskComplete
)创建一个内部接口(com.example.ListView.AsyncTaskComplete
),为com.example.ListView
提供该类型的实例变量,并让活动实现该接口和方法
在自定义ListView的AsyncTask的onPostExecute
中,检查侦听器实例变量是否为null,然后对其调用接口方法
在活动中设置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();
}
}
}
}
在我看来,您想要的是一个监听器或委托方法,当ListView的AsyncTask到达onPostExecute
时,自定义ListView可以调用它。这将使您的自定义组件可重用(例如,如果您在另一个具有不同id的ProgressBar
视图上使用它会怎么样?)
我将使用单个方法(onAsyncTaskComplete
)创建一个内部接口(com.example.ListView.AsyncTaskComplete
),为com.example.ListView
提供该类型的实例变量,并让活动实现该接口和方法
在自定义ListView的AsyncTask的onPostExecute
中,检查侦听器实例变量是否为null,然后对其调用接口方法
在活动中设置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();
}
}
}
}
什么是空的?llParent或调用findViewById()的结果?什么是null?llParent或使用Android 2.2调用findViewById()的结果,不允许使用ListFragment。我不确定我是否理解你的建议。感谢您喜欢接受的答案,但是您没有提供侦听器(这也是一个很好的方法),而是为列表的“progressbar”提供了一个setter:customListView.setProgressBar(theProgressBar)代码>。使用Android 2.2,不允许使用ListFragment。我不确定我是否理解你的建议。感谢您喜欢接受的答案,但是您没有提供侦听器(这也是一个很好的方法),而是为列表的“progressbar”提供了一个setter:customListView.setProgressBar(theProgressBar)代码>。你的建议非常有效,我发现它是解决我的问题的一种非常干净的方法。非常感谢你!你的建议很管用,我发现这是一个非常干净的方法来解决我的问题。非常感谢你!我不知道如何直接访问进度条。该线程的全部要点是如何从子线程访问父项。谢谢,我不知道怎样才能直接进入进度条。该线程的全部要点是如何从子线程访问父项。谢谢