Почему мой класс Fragment не показывает свое содержимое при использовании PagerTabStrip?

Я застрял в одной проблеме, касающейся моих фрагментов. Я просто хочу переключаться между разными фрагментами и показывать меню вверху - вполне стандартное, я думаю - что-то. как здесь:

введите здесь описание изображения

Для этой цели я установил PageAdapter (где SMartFragmentStatePageAdapter только что получен из FragmentStatePagerAdapter):

import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.app.FragmentStatePagerAdapter;

class ViewPagerAdapter extends SmartFragmentStatePagerAdapter {


    public ViewPagerAdapter(FragmentManager manager) {
        super(manager);
    }

    @Override
    public Fragment getItem(int position) {        
        return ArrayListFragment.newInstance(position);
    }

    @Override
    public int getCount() {
        return categories.length;        
    }

    @Override
    public CharSequence getPageTitle(int position) {
        return categories[position];
    }
}

Я инициализирую адаптер страницы в своем основном классе:

viewPager = (ViewPager) findViewById(R.id.pager);
SmartFragmentStatePagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
viewPager.setAdapter(adapter);

И мой класс ArrayFragment выглядит так:

import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.ListFragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;

import java.util.Collections;

public class ArrayListFragment extends ListFragment {
    int mNum;

    /**
     * Create a new instance of CountingFragment, providing "num"
     * as an argument.
     */
    public static ArrayListFragment newInstance(int num) {
        ArrayListFragment f = new ArrayListFragment();

        // Supply num input as an argument.
        Bundle args = new Bundle();
        args.putInt("num", num);
        f.setArguments(args);

        return f;
    }

    /**
     * When creating, retrieve this instance's number from its arguments.
     */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mNum = getArguments() != null ? getArguments().getInt("num") : 1;
    }

    /**
     * The Fragment's UI is just a simple text view showing its
     * instance number.
     */
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.fragment_pager_list, container, false);
        View tv = v.findViewById(R.id.text);
        int page = getArguments().getInt("num", -1);
        ((TextView)tv).setText("Fragment #" + mNum);
        return v;
    }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        setListAdapter(new ArrayAdapter<String>(getActivity(),
                android.R.layout.simple_list_item_1, Collections.singletonList("test1")));
    }

    @Override
    public void onListItemClick(ListView l, View v, int position, long id) {
        Log.i("FragmentList", "Item clicked: " + id);
    }
}

Теперь проблема в том, что для отображения заголовков в PageAdapter мне нужно добавить «PagerTabStrip» в мой файл макета, поэтому мой файл макета для моего основного класса выглядит так:

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

    <android.support.v4.view.ViewPager
        android:id="@+id/pager"
        android:layout_width="match_parent"
        android:layout_height="0px"
        android:layout_weight="1">
        <android.support.v4.view.PagerTabStrip
            android:layout_width="match_parent"
            android:layout_height="match_parent">
        </android.support.v4.view.PagerTabStrip>
    </android.support.v4.view.ViewPager>

        <LinearLayout android:orientation="horizontal"
        android:gravity="center" android:measureWithLargestChild="true"
        android:layout_width="match_parent" android:layout_height="wrap_content"
        android:layout_weight="0">
        <Button android:id="@+id/goto_first"
            android:layout_width="wrap_content" android:layout_height="wrap_content"
            android:text="first">
        </Button>
        <Button android:id="@+id/goto_last"
            android:layout_width="wrap_content" android:layout_height="wrap_content"
            android:text="last">
        </Button>
    </LinearLayout>
</LinearLayout>

Теперь проблема в том, что когда я использую PagerTabStrip, содержимое ArrayFragment не отображается:

С PagerTabStrip:

введите здесь описание изображения

Без PagerTabStrip:

введите здесь описание изображения

Итак, без PagerTabStrip содержимое отображается, и я не знаю, почему.

Я прочитал здесь, что решением может быть использование getChildFragmentManager( ) вместо getSupportFragmentManager(). Но эту функцию можно использовать только в том случае, если мой основной класс является производным от Fragment, но он является производным от FragmentActivity, поэтому это не может быть решением для меня.

Любые идеи?


person Emad Easa    schedule 13.06.2020    source источник


Ответы (1)


Тем временем я узнал, что пошло не так.

Я был почти уверен, что проблема должна быть в файле макета, и это действительно так. Вероятно, мне не стоило устанавливать android:layout_height="0px" :) Результат многочасового взлома без перерыва.

Так что с небольшими адаптациями ViewPager это работало как шарм:

<android.support.v4.view.ViewPager
        android:id="@+id/pager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="1">
            <android.support.v4.view.PagerTabStrip
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="top"
            android:paddingBottom="10dp"
            android:paddingTop="10dp">
        </android.support.v4.view.PagerTabStrip>
    </android.support.v4.view.ViewPager>

Спасибо всем, кто уже начал анализировать!

person Emad Easa    schedule 13.06.2020