使用 FragmentPagerAdapter 从主 Activity 调用 Fragment 方法

Rin*_*tel 0 java android android-fragments android-viewpager android-fragmentactivity

我想从 MainActivity 调用 My Fragment 方法。我从这里找到了很好的解决方案。我正在学习android,所以没有太多技术知识。我的情况略有不同。我在用FragmentPagerAdapter在 MainActivity 中使用如下所示:

\n\n
class ViewPagerAdapter extends FragmentPagerAdapter {\n    private final List<Fragment> mFragmentList = new ArrayList<>();\n    private final List<String> mFragmentTitleList = new ArrayList<>();\n\n    ViewPagerAdapter(FragmentManager manager) {\n        super(manager);\n    }\n\n    @Override\n    public Fragment getItem(int position) {\n        return mFragmentList.get(position);\n    }\n\n    @Override\n    public int getCount() {\n        return mFragmentList.size();\n    }\n\n    void addFragment(Fragment fragment, String title) {\n        mFragmentList.add(fragment);\n        mFragmentTitleList.add(title);\n    }\n\n    @Override\n    public CharSequence getPageTitle(int position) {\n        return mFragmentTitleList.get(position);\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

和我的ViewPager如下所示:

\n\n
   private void setupViewPager(ViewPager viewPager) {\n        ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());\n        adapter.addFragment(new HomeFragment(), "HOME");\n        adapter.addFragment(new AccountFragment(), "ACCOUNT");\n        adapter.addFragment(new SetupFragment(), "SETUP");\n        viewPager.setAdapter(adapter);\n    }\n
Run Code Online (Sandbox Code Playgroud)\n\n

现在我想打电话给我HomeFragment从我的 MainActivity 调用我的函数。我该怎么做?

\n\n

作为示例答案,我可以这样做:

\n\n
ExampleFragment fragment = (ExampleFragment) getSupportFragmentManager().findFragmentByTag(\xe2\x80\x9cFragTagName\xe2\x80\x9d); \nfragment.specific_function_name();\n
Run Code Online (Sandbox Code Playgroud)\n\n

但我不知道如何在使用时为我的片段设置标签FragmentPagerAdapter。如果有人可以帮助我解决这个问题,请告诉我。

\n\n

主要活动代码:

\n\n
public class HomeActivity extends AppCompatActivity implements BottomNavigationView.OnNavigationItemSelectedListener {\n\n    private ViewPager viewPager;\n    private BottomNavigationView bottomNavigationView;\n    Toolbar toolbar;\n    private DrawerLayout mDrawerLayout;\n    private ActionBarDrawerToggle mDrawerToggle;\n    private ListView mDrawerList;\n\n\n    @Override\n    protected void onCreate(@Nullable Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.activity_home);\n        ButterKnife.bind(this);\n\n        toolbar = findViewById(R.id.toolbar);\n        setSupportActionBar(toolbar);\n        getSupportActionBar().setDisplayHomeAsUpEnabled(true);\n\n        mDrawerLayout = findViewById(R.id.drawer_layout);\n        mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, R.string.navigation_drawer_open, R.string.navigation_drawer_close);\n        mDrawerToggle.syncState();\n        Activity mActivity = this;\n\n        viewPager = findViewById(R.id.viewpager);\n        bottomNavigationView = findViewById(R.id.bottomNavigationView);\n        bottomNavigationView.setOnNavigationItemSelectedListener(this);\n\n\n        //\n        mDrawerList = findViewById(R.id.left_drawer);\n        DrawerItem[] drawerItem = new DrawerItem[4];\n        drawerItem[0] = new DrawerItem(R.drawable.compare, "Compare");\n        drawerItem[1] = new DrawerItem(R.drawable.on, "Notification");\n        drawerItem[2] = new DrawerItem(R.drawable.support, "Support");\n        drawerItem[3] = new DrawerItem(R.drawable.news, "News");\n        DrawerItemCustomAdapter adapter = new DrawerItemCustomAdapter(this, R.layout.list_drawer, drawerItem);\n        mDrawerList.setAdapter(adapter);\n        mDrawerList.setOnItemClickListener(new DrawerItemClickListener());\n\n\n        //\n\n\n        setupViewPager(viewPager);\n        viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {\n            @Override\n            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {\n\n            }\n\n            @Override\n            public void onPageSelected(int position) {\n                if (position == 0) {\n                    bottomNavigationView.setSelectedItemId(R.id.menuHome);\n                } else if (position == 1) {\n                    bottomNavigationView.setSelectedItemId(R.id.menuAccount);\n                } else {\n                    bottomNavigationView.setSelectedItemId(R.id.menuSetup);\n                }\n            }\n\n            @Override\n            public void onPageScrollStateChanged(int state) {\n\n            }\n        });\n\n        SharedPreferences pref = mActivity.getSharedPreferences("setting", MODE_PRIVATE);\n        int membership = pref.getInt("membership", 1);\n        if (membership == 0) {\n            if (!HomeActivity.this.isFinishing()) {\n                AlertManager.createCallbackAlert(mActivity, "Warning", "Trial expired if premium not purchased your account history will be deleted in 1 days", false, "OK", new DialogInterface.OnClickListener() {\n                    @Override\n                    public void onClick(DialogInterface dialog, int which) {\n                        dialog.dismiss();\n                    }\n                }, "BUY", new DialogInterface.OnClickListener() {\n                    @Override\n                    public void onClick(DialogInterface dialog, int which) {\n                        dialog.dismiss();\n                        viewPager.setCurrentItem(1);\n                    }\n                });\n            }\n        }\n    }\n\n    @Override\n    public void onActivityResult(int requestCode, int resultCode, Intent data) {\n        super.onActivityResult(requestCode, resultCode, data);\n    }\n\n    private void setupViewPager(ViewPager viewPager) {\n        ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());\n        adapter.addFragment(new HomeFragment(), "HOME");\n        adapter.addFragment(new AccountFragment(), "ACCOUNT");\n        adapter.addFragment(new SetupFragment(), "SETUP");\n        viewPager.setAdapter(adapter);\n    }\n\n    @Override\n    public boolean onNavigationItemSelected(@NonNull MenuItem item) {\n        switch (item.getItemId()) {\n            case R.id.menuHome:\n                viewPager.setCurrentItem(0);\n\n                break;\n            case R.id.menuAccount:\n                viewPager.setCurrentItem(1);\n\n                break;\n            case R.id.menuSetup:\n\n                viewPager.setCurrentItem(2);\n                break;\n        }\n\n\n        return true;\n    }\n\n\n\n    class ViewPagerAdapter extends FragmentPagerAdapter {\n        private final List<Fragment> mFragmentList = new ArrayList<>();\n        private final List<String> mFragmentTitleList = new ArrayList<>();\n\n        ViewPagerAdapter(FragmentManager manager) {\n            super(manager);\n        }\n\n        @Override\n        public Fragment getItem(int position) {\n            return mFragmentList.get(position);\n\n        }\n\n        @Override\n        public int getCount() {\n            return mFragmentList.size();\n\n        }\n\n        void addFragment(Fragment fragment, String title) {\n            mFragmentList.add(fragment);\n            mFragmentTitleList.add(title);\n        }\n\n        @Override\n        public CharSequence getPageTitle(int position) {\n            return mFragmentTitleList.get(position);\n        }\n    }\n\n    private boolean bIsBackPressed = false;\n\n    public void onBackPressed() {\n\n        if (!bIsBackPressed) {\n            if (this.mDrawerLayout.isDrawerOpen(GravityCompat.START)) {\n                this.mDrawerLayout.closeDrawer(GravityCompat.START);\n            } else {\n                Toast.makeText(this, "Press Back again to exit", Toast.LENGTH_SHORT)\n                        .show();\n                bIsBackPressed = true;\n                new Thread(new Runnable() {\n                    public void run() {\n                        try {\n                            Thread.sleep(2000);\n                        } catch (Exception pE) {\n                            Log.e("BackPressed Error", Log.getStackTraceString(pE));\n                        }\n                        bIsBackPressed = false;\n                    }\n                }).start();\n            }\n        } else\n            finish();\n    }\n\n    @Override\n    public boolean onOptionsItemSelected(MenuItem item) {\n\n        if (mDrawerToggle.onOptionsItemSelected(item))\n            return true;\n\n\n        return super.onOptionsItemSelected(item);\n    }\n\n\n\n    private class DrawerItemClickListener implements ListView.OnItemClickListener {\n\n        @Override\n        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {\n            selectItem(position);\n\n        }\n\n    }\n\n    private void selectItem(int position) {\n\n\n        switch (position) {\n            case 0:\n                Toast.makeText(HomeActivity.this,"Clicked",Toast.LENGTH_SHORT).show();\n                break;\n            case 1:\n                changeNotification();\n                /*Intent i = new Intent(Intent.ACTION_VIEW);\n                i.setData(Uri.parse(constant.URL_PRIVACY));\n                startActivity(i);*/\n                break;\n            case 2:\n                startActivity(new Intent(HomeActivity.this, SupportActivity.class));\n                break;\n                /*Intent web = new Intent(Intent.ACTION_VIEW);\n                web.setData(Uri.parse(constant.URL));\n                startActivity(web);*/\n            case 3:\n                startActivity(new Intent(HomeActivity.this, NewsActivity.class));\n                break;\n\n            default:\n                break;\n        }\n            mDrawerLayout.closeDrawer(mDrawerList);\n\n\n    }\n\n    public void changeNotification() {\n        final Dialog dialog = new Dialog(HomeActivity.this);\n        //  dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); // before\n        dialog.setContentView(R.layout.dialog_change_sound);\n        dialog.setCancelable(true);\n\n        WindowManager.LayoutParams lp = new WindowManager.LayoutParams();\n        lp.copyFrom(dialog.getWindow().getAttributes());\n        lp.width = WindowManager.LayoutParams.WRAP_CONTENT;\n        lp.height = WindowManager.LayoutParams.WRAP_CONTENT;\n        RecyclerView rvSounds = dialog.findViewById(R.id.rvSounds);\n        rvSounds.setLayoutManager(new LinearLayoutManager(dialog.getContext()));\n        rvSounds.setAdapter(new SoundsAdapter(dialog.getContext()));\n\n        dialog.findViewById(R.id.btnSave).setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                dialog.dismiss();\n            }\n        });\n\n        dialog.findViewById(R.id.btnCancel).setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                dialog.dismiss();\n            }\n        });\n\n        dialog.show();\n        dialog.getWindow().setAttributes(lp);\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

我想在行中添加方法:

\n\n
case 0:           \n  Toast.makeText(HomeActivity.this,"Clicked",Toast.LENGTH_SHORT).show();\n  break;\n
Run Code Online (Sandbox Code Playgroud)\n\n

谢谢。

\n

MrE*_*r13 6

在您的活动顶部添加ViewPagerAdapter pagerAdapter;

然后用它来创建您的 ViewPager 适配器

pagerAdapter = new ViewPagerAdapter(getSupportFragmentManager());
Run Code Online (Sandbox Code Playgroud)

然后用它来访问ViewPager的第一页

Fragment fragment = pagerAdapter.getItem(0);
Run Code Online (Sandbox Code Playgroud)

首先确保上面的语句返回不为 null 并且该片段是 HomeFragment。现在将片段投射到您的 HomeFragment 并调用该方法

((HomeFragment) fragment).yourMethod();
Run Code Online (Sandbox Code Playgroud)