【问题标题】:getChildFragmentManager () cannot be resolved or cannot be referencedgetChildFragmentManager() 无法解析或无法引用
【发布时间】:2016-05-07 13:30:30
【问题描述】:

我知道,已经有很多关于这个主题的论坛帖子,但没有一个能解决我的问题

我的代码如下所示:

private SectionsPagerAdapter myAdapt;
private ViewPager myPager;
....

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

    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    // Create the adapter that will return a fragment for each of the three
    // primary sections of the activity.
    if (mSectionsPagerAdapter == null) {
        mSectionsPagerAdapter = new SectionsPagerAdapter(getChildFragmentManager());
    }
    // Set up the ViewPager with the sections adapter.
    mViewPager = (ViewPager) findViewById(R.id.container);
    mViewPager.setAdapter(mSectionsPagerAdapter);
....

但我收到了Cannot resolve method getChildFragmentManager (),这似乎会造成很多问题。

我已经尝试了很多东西:

  • 我检查了入站支持库的版本是否正确。
  • 我尝试将该方法引用为 android.support.v7.app.getChildFragmentManager(),这让我遇到了 Cannot make static reference from non-static context 错误。
  • 我重新导入了 v4 支持库

出现了整个问题,因为每当我返回活动时,片段就会变空。如果您有其他想法,请随时回答或发表评论,那么关于 getChildFragmentManager 的整个问题无论如何都解决了

我不知道该怎么办......

ps:这是整个类的实现:

import android.support.v4.app.FragmentManager;
import android.content.Intent;
import android.os.AsyncTask;
import android.support.design.widget.TabLayout;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v4.app.Fragment;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;

import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.os.Bundle;

import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;


public class HomeScreen extends AppCompatActivity {

    int index = 0;
    int semIndex = 0;

    public static final String GROUP_EXTRA = "Group";
    public static final String HOME_SCREEN_LOG = "HomeScreen Activity";

    /**
     * The {@link android.support.v4.view.PagerAdapter} that will provide
     * fragments for each of the sections. We use a
     * {@link FragmentPagerAdapter} derivative, which will keep every
     * loaded fragment in memory. If this becomes too memory intensive, it
     * may be best to switch to a
     * {@link android.support.v4.app.FragmentStatePagerAdapter}.
     */
    private SectionsPagerAdapter mSectionsPagerAdapter;

    /**
     * The {@link ViewPager} that will host the section contents.
     */
    private ViewPager mViewPager;

    LayoutInflater inflater;

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

        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        // Create the adapter that will return a fragment for each of the three
        // primary sections of the activity.
        if (mSectionsPagerAdapter == null) {
            mSectionsPagerAdapter = new SectionsPagerAdapter(getChildFragmentManager());
        }
        // Set up the ViewPager with the sections adapter.
        mViewPager = (ViewPager) findViewById(R.id.container);
        mViewPager.setAdapter(mSectionsPagerAdapter);

        TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
        tabLayout.setupWithViewPager(mViewPager);

        final Bundle b;
        if ((b =this.getIntent().getExtras()) != null) {
            AsyncTask at = new AsyncTask() {
                @Override
                protected Object doInBackground(Object[] params) {

                    String  groupName = b.getString(HomeScreen.GROUP_EXTRA),
                            desc = b.getString(NewEditGroupActivity.DESC_EXTRA),
                            time = b.getString(NewEditGroupActivity.TIME_EXTRA),
                            date = b.getString(NewEditGroupActivity.DATE_EXTRA);

                    int numOfPart = b.getInt(NewEditGroupActivity.NUM_EXTRA);

                    boolean regular = b.getBoolean(NewEditGroupActivity.IS_NEW);

                    ExpandListChild elc = new ExpandListChild(desc,String.valueOf(numOfPart),date,time,regular);
                    ExpandListGroup elg = new ExpandListGroup(groupName);

                    MyLgFragment lf = (MyLgFragment) mSectionsPagerAdapter.getItem(0);
                    AllLgFragment af = (AllLgFragment) mSectionsPagerAdapter.getItem(1);

                    af.add(elc,elg);
                    lf.add(elc,elg);
                    return null;
                }
            };
        }

        mViewPager = (ViewPager) findViewById(R.id.container);
        mViewPager.setAdapter(mSectionsPagerAdapter);    
        inflater = getLayoutInflater();
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_home_screen, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}

如果您需要更多信息,请告诉我。

【问题讨论】:

  • 使用getChildFragmentManager 方法在当前Fragment中放置和管理Fragment,在Activity中放置和管理Fragment使用getSupportFragmentManager 方法

标签: android fragment


【解决方案1】:

getChildFragmentManager()Fragment 的一个方法。由于您正在继承 AppCompatActivity,因此您无法访问它。如果您使用支持库中的Fragment,您可以使用getSupportFragmentManager()

【讨论】:

  • 好的,谢谢。我正在使用 supportFragmentManager,但每当我更改活动并再次返回它时,片段就会变为空。关于 stackoverflow 的一个建议是使用 ChildManager。如何“解决空虚问题”?
  • 空虚是什么意思?你能发布适配器吗?
  • 每当我切换到另一个 Activity 并返回时,SectionsPagerAdapter 中的所有条目都消失了...请参阅此 google 搜索:google.de/…
  • 他们都在描述相同的问题,同时通过将getSupprtFragmentManager 替换为getChildFragmentManager 来修复它
  • SectionsPagerAdapter 不是Android 的类。你写了吗?我可以看看代码吗? getCountgetItem 返回什么?
【解决方案2】:

你应该这样做:

adapter = new ViewPagerAdapter(this.getChildFragmentManager());

【讨论】:

    【解决方案3】:

    我遇到了完全相同的问题,我通过简单地添加来解决它:

    viewpager.setOffscreenPageLimit(2);
    

    正如in this post所建议的那样。

    【讨论】:

    • 非常感谢!
    【解决方案4】:

    这可能不是最优雅的解决方案,但在我的情况下,我需要 viewpager 在其自己的片段中运行,同时工具栏和 tablayout 驻留在 MainAcitivy 中。 唯一的缺点是您必须在其他不使用 Tab/Viewpager 的 Fragment 中手动隐藏 TabLayout。

    但是这样你仍然可以从 Fragment 调用 getChildFragmentManager。

    @Nullable
    @Override
    public View onCreateView(final LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.fragment_rides_host, container, false);
    
        viewPager = (ViewPager) v.findViewById(R.id.fm_feed_host_viewpager);
    
        setupViewPager(viewPager);
    
        ((MainActivity)getActivity()).mTabLayout.setupWithViewPager(viewPager);
    
        return v;
    }
    
    private void setupViewPager(ViewPager viewPager) {
    
        ViewPagerAdapter adapter = new ViewPagerAdapter(this.getChildFragmentManager());
    
        adapter.addFragment(new YourFragment(), "Title");
        adapter.addFragment(...);
        viewPager.setAdapter(adapter);
    }
    

    【讨论】:

      【解决方案5】:

      使用 Kotlin,与我使用的 Fragment 一起使用:

      //using this.childFragmentManager
      //not as this.childFragmentManager()
      val sectionsPagerAdapter = CameraTabLayoutAdapter(this.childFragmentManager)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多