Почему ListFragment работает без тега ListView? - PullRequest
0 голосов
/ 09 февраля 2019

Это скорее сомнение, чем проблема, у меня ListFragment работает без тега в ресурсе файла xml.

В соответствии со следующей ссылкой, ListFragment нужен файл XML с tag, https://developer.android.com/reference/android/app/ListFragment

Итак, приведенный ниже код работает нормально, но я не знаю, является ли он правильным

Возможно, это из-за этой темы, Разница между android.app.Фрагмент и android.support.v4.app.Fragment

И проблема в том, что я работаю с android-support-v4-app-фрагментом, а ссылка - для android-app-фрагмента.

Спасибо .-

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">


    <FrameLayout
        android:id="@+id/newFrame"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/colorPrimary">

    </FrameLayout>

</LinearLayout>


package com.example.android.myapplication;

import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        FragmentManager fragmentManager = getSupportFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

        Fragment fragmentA = new FragmentA();
        fragmentTransaction.add(R.id.newFrame, fragmentA, "fragmentA");
        fragmentTransaction.commit();
    }
}

package com.example.android.myapplication;

import android.os.Bundle;
import android.support.v4.app.ListFragment;
import android.widget.ArrayAdapter;
import android.widget.ListAdapter;

public class FragmentA extends ListFragment {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        String dataArray[] = new String[]{"One", "Two", "Three",};

        ListAdapter listAdapter = new ArrayAdapter<String>(getActivity(),
                android.R.layout.simple_list_item_1, dataArray);

        setListAdapter(listAdapter);
    }

}

1 Ответ

0 голосов
/ 09 февраля 2019

Причина, по которой это работает, заключается в том, что onCreateView в ListFragment создает для вас простой ListView.

Вот исходный код Android для ListFragment:

/**
 * Provide default implementation to return a simple list view.  Subclasses
 * can override to replace with their own layout.  If doing so, the
 * returned view hierarchy <em>must</em> have a ListView whose id
 * is {@link android.R.id#list android.R.id.list} and can optionally
 * have a sibling view id {@link android.R.id#empty android.R.id.empty}
 * that is to be shown when the list is empty.
 * 
 * <p>If you are overriding this method with your own custom content,
 * consider including the standard layout {@link android.R.layout#list_content}
 * in your layout file, so that you continue to retain all of the standard
 * behavior of ListFragment.  In particular, this is currently the only
 * way to have the built-in indeterminant progress state be shown.
 */
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    return inflater.inflate(com.android.internal.R.layout.list_content,
            container, false);
}

Исходный код дляListFragment

Файл list_content.xml содержит следующий ListView:

<ListView android:id="@android:id/list"
    android:layout_width="match_parent" 
    android:layout_height="match_parent" />

Если, однако, ваш код должен был переопределить onCreateView в ListFragment для предоставления пользовательского макета, то ваш макет будетнеобходимо явно объявить ListView.

Примечание. Вероятно, стоит упомянуть, что ListView в настоящее время классифицируется как «устаревшее» представление в Android Studio.Большинство новых приложений в настоящее время должны использовать RecyclerView в большинстве случаев.

Следующая команда Android Studio создаст для вас полностью рабочий список примеров RecyclerView:

File -> New -> Fragment (List)  

[В настоящее время он создает список, полученный из Fragment, а не ListFragment]

...