【问题标题】:How to Intent into specific Tab Fragment?如何意图进入特定的标签片段?
【发布时间】:2017-04-03 07:20:03
【问题描述】:

T 有两个活动:MainActivity 和 LoginActivity。我也有一个Fragment,名字是TabFragment(带有一个TabLayout),它的父级是MainActivity。如何从我的登录活动中进入特定的 TabFragment。

这是我的主要活动:

 protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        id = getIntent().getStringExtra("id");


        if (savedInstanceState == null) {
     getSupportFragmentManager().beginTransaction().replace(R.id.confrag, new FragmentUtama()).commit();
            getSupportFragmentManager().beginTransaction().replace(R.id.confrag, new TabFragment()).commit();
        }
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        sharedPreferences = getSharedPreferences("login.conf", MODE_PRIVATE);
        editor = sharedPreferences.edit();
        String username = sharedPreferences.getString("username", "");
        String password = sharedPreferences.getString("password", "");
        Log.d(TAG, "Username:"+username+"\npassword:"+password);


        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
                this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
        drawer.setDrawerListener(toggle);
        toggle.syncState();

        NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
        navigationView.setNavigationItemSelectedListener(this);

    }

这是我的标签片段:

  public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.viewpager, null);

        tabLayout = (TabLayout)view.findViewById(R.id.tabs);
        viewPager = (ViewPager)view.findViewById(R.id.viewpager);
        viewPager.setAdapter(new Adapterbaru(getChildFragmentManager()));
         tabLayout.post(new Runnable() {
            @Override
            public void run() {
                tabLayout.setupWithViewPager(viewPager);
            }
        });
        Long tsLong = System.currentTimeMillis()/1000;
        String ts = tsLong.toString();


        return view;
    }

    public interface OnFragmentInteractionListener {

        void onFragmentInteraction(Uri uri);
    }
    public class Adapterbaru extends FragmentPagerAdapter{
        public Adapterbaru(FragmentManager fm){
            super(fm);
        }

        @Override
        public Fragment getItem(int position) {
            switch (position){
                case 0 : {
                    return new Fragmentone();
                }
                case 1 : {
                    return new FragmentTwo();

                }
                case 2 : {
                    return new Fragmenttree();

                }
            }
            return null;
        }

        @Override
        public int getCount() {
           return jumlah_tab;
        }

        @Override
        public CharSequence getPageTitle(int position) {
            switch(position){
                case 0 : {
                    return "First";

                }
                case 1 : {
                    return "Second";

                }
                case 2 : {
                    return "Third";
                }
            }
            return null;
        }

【问题讨论】:

    标签: android android-fragments android-tablayout


    【解决方案1】:
    1. 从您的LoginActivity,将标签片段(FragmentOne, FragmentTwo, FragmentThree) id 作为0, 1, 2 传递到Intent

      Intent intent  = new Intent(LoginActivity.this, MainActivity.class);
      intent.putExtra("FRAGMENT_ID", 0);
      startActivity(intent);
      
    2. 在您的MainActivity中,从Intent获取片段ID

      // Inside OnCreate()
      int fragmentId = getIntent().getIntExtra("FRAGMENT_ID", 0);
      
    3. MainActivity,使用FragmentManager 显示TabFragment,并使用BundlefragmentId 传递给TabFragment

      // Inside OnCreate()
      Bundle bundle = new Bundle();
      bundle.putString("TARGET_FRAGMENT_ID", fragmentId);
      TabFragment tabFragment = new TabFragment();
      tabFragment.setArguments(bundle);
      
      getSupportFragmentManager().beginTransaction().replace(R.id.confrag, tabFragment).commit();
      
    4. TabFragment中,从Bundle获取目标片段(FragmentOne, FragmentTwo, FragmentThree) id,最后使用ViewPager.setCurrentItem(POSITION)方法显示想要的片段。

      // Inside OnCreateView()
      int position = getArguments().getInt("TARGET_FRAGMENT_ID"); 
      viewpager.setCurrentItem(position);
      

    希望对你有帮助~

    【讨论】:

    • 谢谢先生,我的 TabFragment 也一样
    • 我的代码和你的@FerdousAhamed 有什么区别?
    • @VinodPattanshetti 请参阅我的第 3 点和第 4 点,您会发现不同之处。没有 TabFragment 的 viewpager.setCurrentItem() 怎么可能选择想要的 Fragment? TabFragment 是子片段的容器,因此您应该通过 TabFragment 传递数据并使用它控制子片段的选择/可见性。希望你能理解。
    • @DennyKurniawan 如果我的回答解决了您的问题并且对您有用,那么请投赞成票。在此先感谢:)
    • @DennyKurniawan 如果我的回答似乎有用,请投赞成票。在此先感谢:)
    【解决方案2】:

    你可以检查为

    if(isFromLogin){
      viewpager.setCurrentItem(specificFragmentPosition);
    }
    

    编码愉快!

    【讨论】:

    • hai,谢谢先生的回答,但我不明白,先生,我必须从 bundle 或其他东西发送数据?
    • 是的,只要通过 LoginActivity 完成意图,您需要通过要打开的 tabFragment 的 bundle(intent) 传递位置
    【解决方案3】:
    viewpager.setCurrentItem(posotion);
    

    【讨论】:

      【解决方案4】:

      从你的 LoginActivity 传递这样的 Intent

      在 LoginActivity.class 中

      Intent intent  = new Intent(LoginActivity.this, MainActivity.class);
      intent.putExtra("Fragmentone", 0); //pass zero for Fragmentone.
      startActivity(intent);
      
      Intent intent  = new Intent(LoginActivity.this, MainActivity.class);
          intent.putExtra("FragmentTwo", 1); //pass zero for FragmentTwo.
          startActivity(intent);
      
      Intent intent  = new Intent(LoginActivity.this, MainActivity.class);
          intent.putExtra("FragmentThree", 2); //pass zero for FragmentThree.
          startActivity(intent);
      

      在 MainActivity.class 中

      int value = getIntent().getIntExtra("Fragmentone", 0);
      

      像这样从你的活动通行证

      Bundle bundle = new Bundle();
      bundle.putString("key", value);
      FragmentOne fragmentOne = new FragmentOne();
      fragmentOne.setArguments(bundle);
      

      在Fragment的oncreateView里面请定义这个

      @Override
      public View onCreateView(LayoutInflater inflater, ViewGroup container,
              Bundle savedInstanceState) {
          int strtext = getArguments().getInt("key");    
          return inflater.inflate(R.layout.fragment, container, false);
      }
      

      【讨论】:

      • 您好先生,感谢您的回答,但我的浏览器在我的 TabFragment 内。如何访问我的 viewPager?
      • 谢谢你,先生,你拯救了我的一天!
      • 快乐的编码伙伴。
      猜你喜欢
      • 1970-01-01
      • 2021-03-03
      • 2016-03-08
      • 2013-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多