内部片段中的ViewPager,未显示,不可见

use*_*443 2 android android-fragments android-viewpager android-actionbar

我使用ActionBar,它加载不同的碎片.这是在FragmentActivity类中完成的.其中一个Fragent应该有一个ViewPager包含不同的片段.我现在不再收到任何错误,但ViewPager和PagerTitleStrip以及ViewPager中的所有Fragents都没有显示出来.ActionBar中的其他片段正常工作.我正在使用Support-Package中的所有类.我在这里阅读了很多帖子,但我还是找不到它.

在我从FragmentAcivity派生的ActivityClass中,我使用了Listener:

SettingsActiviy.java

protected class SettingsTabsListener implements ActionBar.TabListener {

    private Fragment fragment;

    public SettingsTabsListener(Fragment fragment) {
        this.fragment = fragment;
        Log.e("SettingsTabListener","Contructor Fragment is " + fragment);
    }

    @Override
    public void onTabReselected(Tab tab, android.app.FragmentTransaction ft) {
    }

    @Override
    public void onTabSelected(Tab tab, android.app.FragmentTransaction ft) {
        FragmentManager fragMgr = getSupportFragmentManager();
        FragmentTransaction xaction=fragMgr.beginTransaction();

        // Dont know if we really need that...
        if (fragment instanceof SettingsActivityOverviewFragment) {
            if (fragment == null) {
                fragment = SettingsActivityOverviewFragment.newInstance(appWidgetId);
            }
        }
        xaction.replace(R.id.FragmentPlaceholder, (Fragment)fragment);
        xaction.commit();
    }

    @Override
    public void onTabUnselected(Tab tab, android.app.FragmentTransaction ft) {
        FragmentManager fragMgr = getSupportFragmentManager();
        FragmentTransaction xaction=fragMgr.beginTransaction();

        xaction.remove(fragment);
        xaction.commit();
    }
Run Code Online (Sandbox Code Playgroud)

SettingsActivityOverviewFragment.java

public class SettingsActivityOverviewFragment extends Fragment {
private static final Field sChildFragmentManagerField;
ViewPager viewPager;
PagerAdapter pagerAdapter;

public static final SettingsActivityOverviewFragment newInstance(int appWidgetId){
    SettingsActivityOverviewFragment f = new SettingsActivityOverviewFragment();
    Bundle bdl = new Bundle(1);
    bdl.putInt("appWidgetId", appWidgetId);
    f.setArguments(bdl);
    return f;
}
Run Code Online (Sandbox Code Playgroud)

/*这是由googles nullpointer引起的修复,直到detach-method*/

static {
    Field f = null;
    try {
        f = Fragment.class.getDeclaredField("mChildFragmentManager");
        f.setAccessible(true);
    } catch (NoSuchFieldException e) {
    }
    sChildFragmentManagerField = f;
}

@Override
public void onDetach() {
    super.onDetach();

    if (sChildFragmentManagerField != null) {
        try {
            sChildFragmentManagerField.set(this, null);
        } catch (Exception e) {
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

/*修复结束*/

@Override
  public View onCreateView(LayoutInflater inflater,
                           ViewGroup container,
                           Bundle savedInstanceState) {
    View result=inflater.inflate(R.layout.settings_frag_overview, container, false);
    viewPager=(ViewPager)result.findViewById(R.id.overview_pager);
    Log.e("SettingsActivityOverviewFragment","viewPager content is " + viewPager + ", " + viewPager.getHeight());

    pagerAdapter = buildAdapter();
    new SetAdapterTask().execute();

    return(result);
  }

  private PagerAdapter buildAdapter() {
    return(new SettingsOverviewPagerAdapter(getActivity(), getChildFragmentManager()));
  }

  public void onActivityResult(int requestCode, int resultCode, android.content.Intent data) {

  }

  private class SetAdapterTask extends AsyncTask<Void, Void, Void> {
        protected Void doInBackground(Void... params) {
            return null;
        }

        @Override
        protected void onPostExecute(Void result) {

            if(pagerAdapter != null) viewPager.setAdapter(pagerAdapter);
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

SettingsOverviewPagerAdapter.java

public class SettingsOverviewPagerAdapter extends FragmentPagerAdapter {
Context ctxt=null;

  public SettingsOverviewPagerAdapter(Context ctxt, FragmentManager mgr) {
    super(mgr);
    this.ctxt=ctxt;
  }

  @Override
  public int getCount() {
      Log.i("SettingsOverviewPagerAdapter","getCount returns 10");
    return(10);
  }

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

  @Override
  public String getPageTitle(int position) {
    return(EditorFragment.getTitle(ctxt, position));
  }
}
Run Code Online (Sandbox Code Playgroud)

EditorFragment.java

public class EditorFragment extends Fragment {
private static final String KEY_POSITION = "position";

static EditorFragment newInstance(int position) {
    EditorFragment frag = new EditorFragment();
    Bundle args = new Bundle();

    args.putInt(KEY_POSITION, position);
    frag.setArguments(args);

    return (frag);
}

static String getTitle(Context ctxt, int position) {
    return (String.format("ctest", position + 1));
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View result = inflater.inflate(R.layout.editor, container, false);
    EditText editor = (EditText) result.findViewById(R.id.editor);
    int position = getArguments().getInt(KEY_POSITION, -1);

    editor.setHint(getTitle(getActivity(), position));

    return (result);
}
 }
Run Code Online (Sandbox Code Playgroud)

SettingsFragOverview.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.view.ViewPager
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/overview_pager"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.v4.view.PagerTitleStrip
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_gravity="top"
      android:background="#33b5e5"
      android:textColor="#fff"/>
</android.support.v4.view.ViewPager>
Run Code Online (Sandbox Code Playgroud)

EditorFragment.xml

<?xml version="1.0" encoding="utf-8"?>
<EditText xmlns:android="http://schemas.android.com/apk/res/android"
   android:id="@+id/editor"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:inputType="textMultiLine"
   android:gravity="left|top"
/>
Run Code Online (Sandbox Code Playgroud)

Tob*_*run 8

这通常发生在:

  • 使用内部片段作为ViewPager的父级
  • 父容器中有一个滚动视图.