选择片段 A 时如何在 ViewPager 上不一起启动所有片段

Posted

技术标签:

【中文标题】选择片段 A 时如何在 ViewPager 上不一起启动所有片段【英文标题】:How to not start all fragments together on ViewPager when fragment A is selected 【发布时间】:2018-07-23 18:24:44 【问题描述】:

所以我使用 ViewPager 让我的应用程序更快,而不是为每个布局使用 activity

问题是,在活动中,您可以在 onCreate 中编写代码 它只会在您开始活动时开始,对吧?

但是当你使用 Fragments 和 fragmentPagerAdapter 并为它们使用 ViewPager 时。

您的所有片段都将一起启动它们的 (onCreateView)即使您的 ViewPager 只显示第一个片段

如果您在片段的开头播放声音或动画,它将在后台开始

这是我的 fragmentPagerAdapter 类:

public class PagerAdapter extends FragmentStatePagerAdapter 

    private final List<Fragment> mFragmentList = new ArrayList<>();
    private final List<String> mFragmentTitle = new ArrayList<>();

    public PagerAdapter(FragmentManager fm) 

        super(fm);

    

    @Override
    public Fragment getItem(int position) 

        return mFragmentList.get(position);
    

    @Override
    public int getCount() 
        return mFragmentList.size();
    

    public void addFragment(Fragment fragment, String title) 

        mFragmentList.add(fragment);
        mFragmentTitle.add(title);
    



我有这个(第二个片段)我不希望它在没有被选中的情况下开始

public class GameFragment extends Fragment
    private View gameLayout
    private Animation showBtn;
    private Button button;


    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) 

        gameLayout = inflater.inflate(R.layout.game_layout, container, false);



        button = gameLayout .findViewById(R.id.button);


      // loading my anim xml file
       showBtn = AnimationUtils.loadAnimation(getContext(),R.anim.btn_show);



       button.startAnimation(showBtn);

        loadLevel();






    return  gameLayout 
    

最后这是我有 ViewPager 的活动:

public class ControllerActivity extends AppCompatActivity 

    public CustomPager viewPager;

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


      viewPager = findViewById(R.id.viewPager);
              PagerAdapter adapter = new PagerAdapter(getSupportFragmentManager());

        adapter.addFragment(new HomeFragment(),"Home");
        adapter.addFragment(new GameFragment(),"Game");
        viewPager.setAdapter(adapter);








      viewPager.setCurrentItem(0);


    

我需要你的帮助来告诉我我在这里的错误以及正确的方法是什么

【问题讨论】:

【参考方案1】:

在 View Pager 中使用 OnPageChangeListener,您可以检测当前在 View Pager 中显示的片段。然后,您需要检查显示的是哪个片段,然后调用该片段的类上的方法来启动任何声音,例如,在片段成为视图中的片段之前您不想启动的声音。

您应该为此使用接口。

Here你可以找到一个使用 OnPageChangeListener 的例子。

Here你可以找到一个使用接口的Activity到Fragment通信的例子。此示例有很多与您的用例无关的代码,但演示了接口的使用。

【讨论】:

因为我是初学者还有一个问题,在 OnCreateView 中为每个片段编写繁重的代码是不是很糟糕?比如初始化事物和视图。?或者我到底在哪里做的。 在 onCreateView 中初始化视图就好了,事实上,这是他们应该去的地方,因为这个方法只在创建视图时调用(很有趣),所以视图只会被创建一次. 够清楚了!现在我只需要学习如何从游戏片段内部调用方法:@Override public void onPageSelected 上网看看。如果您遇到困难,请作为另一个问题提出:) 你能看看我的新问题吗?没人在乎:(***.com/q/48912872/8729401【参考方案2】:

“可能”的一种方法是在 onCreateView 中初始化片段的视图:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
        view = inflater.inflate(R.layout.fragment_media_viewer, container, false);

        return view;

然后在重写 setUserVisibleHint() 函数并在那里进行其余的初始化。当片段在视图中时调用此函数。

@Override
public void setUserVisibleHint(boolean isVisibleToUser) 
    super.setUserVisibleHint(isVisibleToUser);

// do the rest of the code here.


我还没有为此目的使用 setuserVisibleHint。但是你可以试试。也告诉我。

【讨论】:

你试过了吗?它给了我一个错误:尝试在空对象引用上调用虚拟方法“android.content.res.Resources android.content.Context.getResources()” 我没有专门为此目的使用 setUserVisibleHint,但我会检查一下并更新我的答案。 嘿伙计,我尝试从相同的地方执行一些非 ui 函数,并且成功了。 @Override public void setUserVisibleHint(boolean isVisibleToUser) super.setUserVisibleHint(isVisibleToUser); if (isVisibleToUser) Log.e(this.getClass().toString(), "获取所有账户"); fetchAccountsFromServer(); 和一些 UI 也可以工作......这也工作了 :) :) 我从 onCreateView 初始化了主视图,然后在 setUserVisibleHint 中初始化了其余的东西。工作正常。 :)

以上是关于选择片段 A 时如何在 ViewPager 上不一起启动所有片段的主要内容,如果未能解决你的问题,请参考以下文章

如何在将 Tablayout 与 viewpager 一起使用时从另一个片段调用 AsyncTask?

在ViewPager上,在onPageSelected上的片段上启动动画

如何知道片段何时在 viewpager 中实际可见

如何解决片段中的 Viewpager 问题?

viewpager 中的 3 个 android 片段,如何让它们全部存活?

如何在同一页面上的 Fragment 内创建具有 3 个 Fragment 的 ViewPager?