如何在 ViewPager 中从 Activity 移动到 Fragment?未找到片段 ID 的视图
Posted
技术标签:
【中文标题】如何在 ViewPager 中从 Activity 移动到 Fragment?未找到片段 ID 的视图【英文标题】:How to move from Activity to Fragment in ViewPage? No view found for id for fragment 【发布时间】:2021-08-19 10:38:50 【问题描述】:我刚开始学习安卓。我有一个 Activity 类,我想将它重定向到导航栏的 ViewPage 中的片段? 我尝试了很多方法,但它不起作用。希望能帮到你!!! 我的代码: 有一个 MainActivity.java 有一个 ViewPager 和 BottomNavigationView
public class MainActivity extends AppCompatActivity
BottomNavigationView navigationView;
ViewPager mViewPager;
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
navigationView = findViewById(R.id.nav);
mViewPager = findViewById(R.id.view_pager);
setUpViewPager();
navigationView.setOnNavigationItemReselectedListener(new BottomNavigationView.OnNavigationItemReselectedListener()
@Override
public void onNavigationItemReselected(@NonNull MenuItem item)
if(item.getItemId()== R.id.cld)
mViewPager.setCurrentItem(0);
else if(item.getItemId()== R.id.tdl)
mViewPager.setCurrentItem(1);
else if(item.getItemId()== R.id.dnr)
mViewPager.setCurrentItem(2);
else if(item.getItemId()== R.id.us)
mViewPager.setCurrentItem(3);
);
try
Field field = CursorWindow.class.getDeclaredField("sCursorWindowSize");
field.setAccessible(true);
field.set(null, 100 * 1024 * 1024); //the 100MB is the new size
catch (Exception e)
e.printStackTrace();
private void setUpViewPager()
ViewPagerAdapter viewPagerAdapter = new ViewPagerAdapter(getSupportFragmentManager(), FragmentStatePagerAdapter.BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT);
mViewPager.setAdapter(viewPagerAdapter);
mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener()
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels)
@Override
public void onPageSelected(int position)
switch (position)
case 1:
navigationView.getMenu().findItem(R.id.tdl).setChecked(true);
break;
case 2:
navigationView.getMenu().findItem(R.id.dnr).setChecked(true);
break;
case 3:
navigationView.getMenu().findItem(R.id.us).setChecked(true);
break;
default: navigationView.getMenu().findItem(R.id.cld).setChecked(true);
break;
@Override
public void onPageScrollStateChanged(int state)
);
ViewPageApdater 类
public class ViewPagerAdapter extends FragmentStatePagerAdapter
public ViewPagerAdapter(@NonNull FragmentManager fm, int behavior)
super(fm, behavior);
@NonNull
@Override
public Fragment getItem(int position)
switch (position)
case 1: return new ListTodo();
case 2: return new dinary_form();
case 3: return new UserInfor();
case 0:
default: return new Calendar();
@Override
public int getCount()
return 5;
我想移动 Activity 类,但我遇到了问题: java.lang.IllegalArgumentException:没有为片段 ListTodobbdabd4 (d10d7649-01eb-4b76-8342-fbf47138d234) id=0x7f0a01d3
找到 id 0x7f0a01d3 (com.example.projectminibook:id/view_pager) 的视图我从 activitymain 中 ViewPager 布局的 id 中获取 id/view_paper。不知道哪里错了
public class AddTodo extends AppCompatActivity
@Override
public void onCreate(@Nullable Bundle savedInstanceState)
super.onCreate(savedInstanceState);
Button btnCancel = findViewById(R.id.btnCancel);
btnSave.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View v)
ListTodo fragment = new ListTodo();
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.add(R.id.view_pager,fragment);
fragmentTransaction.commit();
);
ListTodo.java
public class ListTodo extends Fragment
//mycode
我希望你能帮助我。非常感谢
【问题讨论】:
嘿伙计,我认为您的问题是您只有四个片段,而您正试图获得 5 个片段。因为这个@Override public int getCount() return 5;
尝试返回4个片段。
这不是我的问题
【参考方案1】:
只需在onNavigationItemSelectedListener
中尝试以下代码
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem menuItem)
Fragment fragment = null;
switch (menuItem.getItemId())
case R.id.cld:
viewPager.setCurrentItem(0);
break;
case R.id.tdl:
viewPager.setCurrentItem(1);
break;
case R.id.dnr:
viewPager.setCurrentItem(2);
break;
case R.id.us:
viewPager.setCurrentItem(3);
break;
default:
viewPager.setCurrentItem(0);
break;
return true;
我认为您的问题将在更新您的MainActivity
中的此代码后解决。快乐编码 ;)
更新
上面的代码也有微小的变化&对于viewPager
,请用下面的代码编辑你的onPageSelected()
方法的代码
@Override
public void onPageSelected(int position)
switch (position)
case 1:
NavigationView.setSelectedItemId(R.id.tdl);
break;
case 2:
NavigationView.setSelectedItemId(R.id.dnr);
break;
case 3:
NavigationView.setSelectedItemId(R.id.us);
break;
default:
NavigationView.setSelectedItemId(R.id.cld);
break;
【讨论】:
当我更改上述代码时,viewpaper 无法设置当前项目,它返回空数据 请参考更新后的代码。如果我没有错,现在你的错误就会消失。 不知道有没有打扰到你?但我的问题是我无法从 1 个活动页面重定向到 1 个片段,这是一个导航栏的 viewpager,导航片段(片段)之间的重定向仍然可以正常工作。由于我只是一个学生,刚开始学习,事情对我来说很难,我期待解决这个问题 如果我没记错的话,您正尝试使用底部导航从一个片段导航到另一个片段。但您没有正确导航。我是对还是错? 可能是因为我用错了词,你没明白我的意思。我有类 AddTodo 扩展 AppCompatActivity 并且当我按下保存按钮通过 ListTodo() 重定向时,它是导航栏的 ViewPage 的一个片段,我收到错误:java.lang.IllegalArgumentException: No view found for id 0x7f0a01d3 (com.example.projectminibook: id/view_pager) for fragment ListTodobbdabd4 (d10d7649-01eb-4b76-8342-fbf47138d234) id=0x7f0a01d3 我上面放的每个类的代码。【参考方案2】:您没有直接导航到另一个活动中的那个片段。这就是您收到此 illegalArgumentException
错误的原因。
1)。您必须先导航到该活动。
2)。您必须检查导航活动的来源。 为此,您可以使用 Intent 的 put extra 方法。
3)。如果 intent.put extra 有任何值,那么您必须从一个片段导航到另一个片段。在您的情况下,您必须在主要活动中从日历片段导航到 ListTodo 片段。
public class AddTodo extends AppCompatActivity
@Override
public void onCreate(@Nullable Bundle savedInstanceState)
super.onCreate(savedInstanceState);
Button btnCancel = findViewById(R.id.btnCancel);
btnSave.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View v)
startActivity(new Intent(activity, MainActivity.class).putExtra("from","AddTodo"));
);
& 在MainActivity
的 onCreate 方法中,你必须像这样编写代码。
String comeFrom = getIntent().getStringExtra("from");
if (!(comeFrom.equals("") || comeFrom.isEmpty()) && comeFrom.equals("AddTodo"))
viewPager.setCurrentItem(1); //because your list todo fragment is 2nd fragment in your viewpager
【讨论】:
感谢您的热情,对我这样的初学者很有帮助^^ 这解决了您的问题吗?如果是,请投票并向右打勾。这对我会有帮助。快乐编码 ;)以上是关于如何在 ViewPager 中从 Activity 移动到 Fragment?未找到片段 ID 的视图的主要内容,如果未能解决你的问题,请参考以下文章
如何以编程方式通过 Main Activity 在 ViewPager 中更新刷新片段
响应Activity中的ViewPager2 Fragments事件
从 ViewPager Activity 访问 Fragment 的方法
如何在 Android 中从另一个应用程序启动 Activity