1

Я создаю пользовательский ListFragment для моего приложения для Android. Я хочу добавить ребенка в @id/listContainer. Но я не могу получить ссылку на представление, используя findViewById(android.R.id.listContainer).Невозможно получить идентификатор ресурса для Android.

Это макет по умолчанию для 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.

Что я делаю неправильно?

ответ

1

Попробуйте getListView().getParent(). поскольку getListView() предоставляет виджет представления списка, его родительский элемент должен быть макетом кадра, который вам нужен.

+0

Спасибо @ Droidekas. Это решает проблему. Но вместо вызова 'getListView()' мне пришлось использовать 'view.findViewById (android.R.id.list)', так как 'getListView()' не может быть вызван до того, как Fragment завершит его создание. –

+1

Почему вы не используете метод onViewCreated? – Droidekas

+0

Да. Я тоже могу это сделать. Благодарю. –

0

Проблема заключается в том, как вы обращаетесь к ресурсу:

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 
+0

Все еще не работает. Обратите внимание, что 'list_content.xml' - это файл с платформы Android, это не в моем проекте. –

+0

** вызов com.android.internal.R.id.listContainer ** для доступа к контейнеру списка, определенному в системе Android –

0

Изменить эту строку:

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

Для

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

Это не работает. –

0

Изменить 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); 
+0

Нет. Я не могу это изменить. 'list_content' является внутренним ресурсом. –

Смежные вопросы