gpt4 book ai didi

java - 如何通过 ViewpagerAdapter 访问 View ?

转载 作者:搜寻专家 更新时间:2023-11-01 09:26:10 26 4
gpt4 key购买 nike

这是我第一次使用 ViewPager,一段时间后它现在可以工作了,我可以在三个不同的 Activity(Main、Scan 和 Options)之间切换。我的问题是访问 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 静态化(这会导致 NullpointerException 和 MemoryLeak)
- 将 View 和标题存储在静态 ArrayList 中(ArrayList 为空)
- 使用 MainActivity 调用新方法 mainactivity = new MainActivity()mainactivity.someMethod() (空指针异常)

最佳答案

我同意@yupi。拥有 3 个 fragment 而不是 3 个 Activity 会简单得多。 “将来您将能够维护代码”。

在 Home Activity 中设置此代码后,您必须为(SettingFragment、ScanItemFragment 和 MainContentFragment)创建 fragment 类。您可以将现有布局从已经存在的 Activity 移动到 fragment 的布局。由于 Activity 和 Fragment 之间的生命周期不同,您将不得不进行少量修改,但这不会花费您太多时间。

这段代码完全可以让您着手实现您想要实现的目标。祝你好运!

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;
}
}
}

关于java - 如何通过 ViewpagerAdapter 访问 View ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50439732/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com