如何在 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

<activity> windowSoftInoutMode 不适用于 ViewPager 中的片段

android - 将数据从 Activity 传递到 ViewPager 中的 Fragment