【问题标题】:How to move from Activity to Fragment in ViewPage? No view found for id for fragment如何在 ViewPager 中从 Activity 移动到 Fragment?未找到片段 ID 的视图
【发布时间】: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:没有为片段 ListTodo{bbdabd4 (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个片段。
  • 这不是我的问题

标签: java android android-fragments android-viewpager


【解决方案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 ListTodo{bbdabd4 (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
}

【讨论】:

  • 感谢您的热情,对我这样的初学者很有帮助^^
  • 这解决了您的问题吗?如果是,请投票并向右打勾。这对我会有帮助。快乐编码 ;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-05
  • 2013-09-20
  • 2016-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多