如何通过ViewpageAdapter访问视图?

时间:2018-05-20 21:53:45

标签: java android android-viewpager

这是我第一次使用ViewPager,经过一段时间它现在可以工作,我可以在三个不同的活动(主要,扫描和选项)之间切换。我的问题是访问Main-和ScanActivity中的listViews,EditText和FloatingActionButton。


我想要实现的,应该与此类似:

private FloatingActionButton fab;
public static void setupContent (View view, String title) {
......
fab = view.findViewById (R.id.fab);
....
}
public void someMethod () {
fab.setOnClickListener....
}


对于超出以下代码的参考,请查看我的github:https://github.com/ChristopherPS96/SmartFridge/tree/master/app/src/main/java/com/example/christopher/smartfridge
请注意,这个项目正在进行中,所以并非一切都很完美


这是MainActivity.java中的方法,它可以工作。现在我想扩展它,我可以在ListView上设置OnClickTimeListener,或者对此方法做任何事情。我总是得到NullpointerExceptions或根本没有任何事情发生。

public static void setupContent(View view, String title) {
    if(title.equals("Hauptseite")) {
        FloatingActionButton fab = view.findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(v.getContext(), "Test", Toast.LENGTH_LONG).show();
            }
        });
    }
    if(title.equals("Scanseite")) {
        FloatingActionButton fab = view.findViewById(R.id.fabScan);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(v.getContext(), "Alternativer Test", Toast.LENGTH_LONG).show();
            }
        });
    }
}


到目前为止我尝试了什么:
制作ListView,EditText static(导致NullpointerException和MemoryLeak)
- 存储静态ArrayList中的视图和标题(ArrayList为空)
使用MainActivity mainactivity调用新方法= new MainActivity() mainactivity.someMethod()(NullpointerException)

2 个答案:

答案 0 :(得分:1)

您现在正在做的是在不同的布局之间切换。您可能想要的是使用您现在拥有的每个布局创建三个Fragments。根据{{​​1}}创建适配器扩展FragmentStatePagerAdaptergetItem内部的适配器返回相应的position。比将适配器设置为Fragment,现在您可以在ViewPager中滑动并访问视图。

答案 1 :(得分:1)

我同意@yupi。拥有3个片段而不是3个活动会简单得多。 "您将来可以维护代码"。

在Home活动中设置此代码后,您必须为(SettingFragment,ScanItemFragment和MainContentFragment)创建片段类。您可以将现有布局从现有活动移动到片段的布局。由于活动和片段之间的生命周期不同,您将不得不进行一些修改,但它不应该花费太多时间。

此代码应该完全帮助您开始尝试实现的目标。祝你好运!

public class HomeActivity extends AppCompatActivity {

private SectionPageAdapter mSectionPageAdapter;
private ViewPager mViewPager;
private TabLayout tabLayout;

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

        // Create the adapter that returns a fragment for each tab
        mSectionPageAdapter = new SectionPageAdapter(getSupportFragmentManager());

        //Set up the view pager with different section adapters
        mViewPager = (ViewPager) findViewById(R.id.contentFrameLayout);
        mViewPager.setOffscreenPageLimit(3);
        mViewPager.setAdapter(mSectionPageAdapter);
        mViewPager.setPagingEnabled(false);

        //Set up the tab layout to display tabs
        tabLayout = (TabLayout) findViewById(R.id.homeTabs);
        tabLayout.setupWithViewPager(mViewPager);

    //add icons to tabs and change the text behavior
    for (int i = 0; i< tabLayout.getTabCount(); i++) {

        TabLayout.Tab mTab = tabLayout.getTabAt(i);
        if (mTab != null) {
            switch (i){
                case 0:
                    mTab.setIcon(R.drawable.icon_zero);
                    break;
                case 1:
                    mTab.setIcon(R.drawable.icon_one);
                    break;
                case 2:
                    mTab.setIcon(R.drawable.icon_two);
                    break;
                default:
                    break;
            }
        }
    }
}


/**
 * A {@link FragmentPagerAdapter} that returns a fragment corresponding to
 * one of the tabs.
 */
private class SectionPageAdapter extends FragmentPagerAdapter {

    SectionPageAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int position) {
        switch (position) {
            case 0:
                return (MainContentFragment.newInstance());
            case 1:
                return (ScanItemFragment.newInstance());
            case 2:
                return (SettingFragment.newInstance());
            default:
                break;
        }

            return (null);
    }

    @Override
    public int getCount() {
        return 3;
    }
}
}