Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何从子级访问父级中的布局项?_Android_Android Layout - Fatal编程技术网

Android 如何从子级访问父级中的布局项?

Android 如何从子级访问父级中的布局项?,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" >

我有以下父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>
不幸的是,行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)。你的建议非常有效,我发现它是解决我的问题的一种非常干净的方法。非常感谢你!你的建议很管用,我发现这是一个非常干净的方法来解决我的问题。非常感谢你!我不知道如何直接访问进度条。该线程的全部要点是如何从子线程访问父项。谢谢,我不知道怎样才能直接进入进度条。该线程的全部要点是如何从子线程访问父项。谢谢