简体   繁体   English

如何在 ViewPage 中从 Activity 移动到 Fragment? 未找到片段 ID 的视图

[英]How to move from Activity to Fragment in ViewPage? No view found for id for fragment

I just started learning android.我刚开始学习android。 I have a Activity class and I want to redirects it to a fragment in ViewPage of a Navigation bar?我有一个活动 class 并且我想将其重定向到导航栏的 ViewPage 中的片段? I try many ways but it don't work.我尝试了很多方法,但它不起作用。 I hope to help:.!我希望有所帮助:.! My code: There is a MainActivity.java has a ViewPager and BottomNavigationView我的代码:有一个 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 class ViewPageApdater class

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

And Activity class I want to move and I have a problem: 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} And Activity class I want to move and I have a problem: 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}

I take id/view_paper from id of ViewPager layout in activitymain.我从 activitymain 中的 ViewPager 布局的 id 中获取 id/view_paper。 I dont know where wrong我不知道哪里错了

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 ListTodo.java

public class ListTodo extends Fragment{
  //mycode
}

I hope you can help me.我希望你能帮助我。 Thank you very much非常感谢

Just try below code in onNavigationItemSelectedListener只需在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;
        }

I think your problem will go after update this code in your MainActivity .我认为在MainActivity中更新此代码后,您的问题将是 go 。 Happy Coding;)快乐编码;)


UPDATE更新

the upper code also has minor changes & for the viewPager please edit your code of onPageSelected() method with below code上面的代码也有微小的变化&对于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;

                }
            }

you are not directly navigate to that fragment which is in the another activity.您不会直接导航到另一个活动中的那个片段。 that's why you are getting this illegalArgumentException error.这就是您收到此illegalArgumentException错误的原因。

1). 1)。 you have to navigate to that activity first.您必须先导航到该活动。


2). 2)。 you have to check that the navigated activity is where come from.您必须检查导航活动的来源。 for this you can use Intent's put extra method.为此,您可以使用 Intent 的 put extra 方法。


3). 3)。 if the intent.put extra has any value then you have to navigate from one fragment to another.如果intent.put extra 有任何价值,那么您必须从一个片段导航到另一个片段。 In your case, you have to navigate from calender fragment to ListTodo fragment in main activity.在您的情况下,您必须在主要活动中从日历片段导航到 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"));
            }
        });
    }
}

& in MainActivity 's onCreate method you have to code like this. & 在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
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM