【问题标题】:Unable to get resource ID for Android view无法获取 Android 视图的资源 ID
【发布时间】:2015-11-01 01:11:12
【问题描述】:

我正在为我的 Android 应用程序创建一个自定义 ListFragment。我想在@id/listContainer 中添加一个孩子。但我无法使用findViewById(android.R.id.listContainer) 获取对视图的引用。

这是ListFragment 的默认布局。

list_content.xml

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

    <LinearLayout android:id="@+id/progressContainer"
            android:orientation="vertical"
            android:layout_width="match_parent" 
            android:layout_height="match_parent"
            android:visibility="gone"
            android:gravity="center">

        <ProgressBar style="?android:attr/progressBarStyleLarge"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" />
        <TextView android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textAppearance="?android:attr/textAppearanceSmall"
                android:text="@string/loading"
                android:paddingTop="4dip"
                android:singleLine="true" />

    </LinearLayout>

    <FrameLayout android:id="@+id/listContainer"
            android:layout_width="match_parent" 
            android:layout_height="match_parent">

        <ListView android:id="@android:id/list"
                android:layout_width="match_parent" 
                android:layout_height="match_parent"
                android:drawSelectorOnTop="false" />
        <TextView android:id="@+android:id/internalEmpty"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:gravity="center"
                android:textAppearance="?android:attr/textAppearanceLarge" />
    </FrameLayout>

</FrameLayout>

这是我自定义的ListFragment 代码。

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(android.R.layout.list_content, container, false);

    ProgressBar progressBar = new ProgressBar(getActivity());
    progressBar.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT, Gravity.CENTER));
    progressBar.setIndeterminate(true);

    ViewGroup listContainer = (ViewGroup) view.findViewById(android.R.id.listContainer);
    listContainer.addView(progressBar);

    return view;
}

Android Studio 说error: cannot find symbol variable listContainer

我做错了什么?

【问题讨论】:

    标签: android android-layout android-fragments android-listfragment


    【解决方案1】:

    试试getListView().getParent()。由于getListView() 为您提供了列表视图小部件,它的父级应该是您需要的框架布局。

    【讨论】:

    • 谢谢@Droidekas。它解决了这个问题。但是我不得不使用view.findViewById(android.R.id.list),而不是调用getListView(),因为在片段完成创建之前无法调用getListView()
    • 为什么不用onViewCreated方法?
    • 是的。我也可以这样做。谢谢。
    【解决方案2】:

    问题在于您访问资源的方式:

    ViewGroup listContainer = (ViewGroup) view.findViewById(android.R.id.listContainer);
    listContainer.addView(progressBar);
    

    改成

    ViewGroup listContainer = (ViewGroup) view.findViewById(com.android.internal.R.id.listContainer);
    listContainer.addView(progressBar);
    

    由于listContainer 是一个内部资源,调用它使用

    com.android.internal.R.id.RESOURCE_ID
    

    【讨论】:

    • 还是不行。请注意list_content.xml是Android平台的文件,不在我的项目中。
    • 调用com.android.internal.R.id.listContainer访问Android系统定义的列表容器
    【解决方案3】:

    改变这一行:

      ViewGroup listContainer = 
                     (ViewGroup)view.findViewById(android.R.id.listContainer);
    

      ViewGroup listContainer = 
                     (ViewGroup)view.findViewById(R.id.listContainer);
    

    【讨论】:

      【解决方案4】:

      更改View view = inflater.inflate(android.R.layout.list_content, container, false);

      View view = inflater.inflate(R.layout.list_content, container, false);
      

      这里R必须是导入import com.your_package_name.R;

      现在你可以改变了

      ViewGroup listContainer = (ViewGroup) view.findViewById(android.R.id.listContainer);

      ViewGroup listContainer = (ViewGroup) view.findViewById(R.id.listContainer);
      

      【讨论】:

      • 没有。我无法改变这一点。 list_content 是内部资源。
      猜你喜欢
      • 2012-10-09
      • 1970-01-01
      • 2020-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多