【问题标题】:Navigation drawer with TabLayout带有 TabLayout 的导航抽屉
【发布时间】:2018-10-15 22:25:58
【问题描述】:

我很想制定一个时间表。其中导航抽屉将显示日期,标签栏将显示定时午餐、晚餐、早餐。

问题:如何设置条件让我们同时了解选定的抽屉式导航项和选定的选项卡项。

MessActivity.java

public class MainActivity extends AppCompatActivity
    implements NavigationView.OnNavigationItemSelectedListener {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_mess);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);


    TabLayout tablayout = (TabLayout) findViewById(R.id.tabs);
    ViewPager viewPager = (ViewPager) findViewById(R.id.viewpager);

    tablayout.setupWithViewPager(viewPager);


    tabsPager tabsPager = new tabsPager(getSupportFragmentManager());
    viewPager.setAdapter(tabsPager);


    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.addDrawerListener(toggle);
    toggle.syncState();

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

    viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tablayout));

    tablayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
        @Override
        public void onTabSelected(TabLayout.Tab tab) {
            if (tab.getPosition() == 1) {
                toolbar.setBackgroundColor(ContextCompat.getColor(MessActivity.this,
                        R.color.colorAccent));
                tablayout.setBackgroundColor(ContextCompat.getColor(MessActivity.this,
                        R.color.colorAccent));
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                    getWindow().setStatusBarColor(ContextCompat.getColor(MessActivity.this,
                            R.color.colorAccent));
                }
            } else if (tab.getPosition() == 2) {
                toolbar.setBackgroundColor(ContextCompat.getColor(MessActivity.this,
                        android.R.color.darker_gray));
                tablayout.setBackgroundColor(ContextCompat.getColor(MessActivity.this,
                        android.R.color.darker_gray));
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                    getWindow().setStatusBarColor(ContextCompat.getColor(MessActivity.this,
                            android.R.color.darker_gray));
                }
            } else {
                toolbar.setBackgroundColor(ContextCompat.getColor(MessActivity.this,
                        R.color.colorPrimary));
                tablayout.setBackgroundColor(ContextCompat.getColor(MessActivity.this,
                        R.color.colorPrimary));
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                    getWindow().setStatusBarColor(ContextCompat.getColor(MessActivity.this,
                            R.color.colorPrimaryDark));
                }
            }


        }

        @Override
        public void onTabUnselected(TabLayout.Tab tab) {

        }

        @Override
        public void onTabReselected(TabLayout.Tab tab) {

        }
    });

}

@Override
public void onBackPressed() {
    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    if (drawer.isDrawerOpen(GravityCompat.START)) {
        drawer.closeDrawer(GravityCompat.START);
    } else {
        super.onBackPressed();
    }
}


@SuppressWarnings("StatementWithEmptyBody")
@Override
public boolean onNavigationItemSelected(MenuItem item) {
    // Handle navigation view item clicks here.
    int id = item.getItemId();

    if (id == R.id.monday) {

    } else if (id == R.id.tuesday) {

    } else if (id == R.id.wednesday) {
    } else if (id == R.id.thursday) {

    } else if (id == R.id.friday) {

    } else if (id == R.id.saturday) {

    } else if (id == R.id.sunday) {

    } else if (id == R.id.next) {

    } else if (id == R.id.today) {

    }

    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    drawer.closeDrawer(GravityCompat.START);
    return true;
}
}

tabsPager.java

public class tabsPager extends FragmentStatePagerAdapter {


String[] titles=new String[]{"Breakfast","Lunch","Dinner"};

public tabsPager(FragmentManager fm) {
    super(fm);
}

@Nullable
@Override
public CharSequence getPageTitle(int position) {
    return titles[position];
}

@Override
public Fragment getItem(int position) {
    switch (position) {
        case 0:
            BreakfastFragment breakfastFragment =new BreakfastFragment();

            return  breakfastFragment;
        case 1: LunchFragment lunchFragment =new LunchFragment();
            return lunchFragment;
        case 2:
            DinnerFragment dinnerFragment =new DinnerFragment();
            return dinnerFragment;



    }
    return  null;
}

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

编辑 消息活动

public class MessActivity extends AppCompatActivity
    implements NavigationView.OnNavigationItemSelectedListener {
public static int selectedNavigationMenuID= 0;



@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_mess);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);


    TabLayout tablayout = (TabLayout) findViewById(R.id.tabs);
    ViewPager viewPager = (ViewPager) findViewById(R.id.viewpager);

    tablayout.setupWithViewPager(viewPager);



    tabsPager tabsPager = new tabsPager(getSupportFragmentManager());
    viewPager.setAdapter(tabsPager);

    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.addDrawerListener(toggle);
    toggle.syncState();

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

    viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tablayout));

    tablayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
        @Override
        public void onTabSelected(TabLayout.Tab tab) {

            if (tab.getPosition() == 1) {
                toolbar.setBackgroundColor(ContextCompat.getColor(MessActivity.this,
                        R.color.colorAccent));
                tablayout.setBackgroundColor(ContextCompat.getColor(MessActivity.this,
                        R.color.colorAccent));
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                    getWindow().setStatusBarColor(ContextCompat.getColor(MessActivity.this,
                            R.color.colorAccent));
                }





            } else if (tab.getPosition() == 2) {
                toolbar.setBackgroundColor(ContextCompat.getColor(MessActivity.this,
                        android.R.color.darker_gray));
                tablayout.setBackgroundColor(ContextCompat.getColor(MessActivity.this,
                        android.R.color.darker_gray));
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                    getWindow().setStatusBarColor(ContextCompat.getColor(MessActivity.this,
                            android.R.color.darker_gray));
                }
            } else {
                toolbar.setBackgroundColor(ContextCompat.getColor(MessActivity.this,
                        R.color.colorPrimary));
                tablayout.setBackgroundColor(ContextCompat.getColor(MessActivity.this,
                        R.color.colorPrimary));
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                    getWindow().setStatusBarColor(ContextCompat.getColor(MessActivity.this,
                            R.color.colorPrimaryDark));
                }
            }


        }

        @Override
        public void onTabUnselected(TabLayout.Tab tab) {

        }

        @Override
        public void onTabReselected(TabLayout.Tab tab) {

        }
    });

}


@Override
public void onBackPressed() {
    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    if (drawer.isDrawerOpen(GravityCompat.START)) {
        drawer.closeDrawer(GravityCompat.START);
    } else {
        super.onBackPressed();
    }
}

@SuppressWarnings("StatementWithEmptyBody")
@Override
public boolean  onNavigationItemSelected(MenuItem item) {
    // Handle navigation view item clicks here.
    selectedNavigationMenuID=item.getItemId();
    int id = item.getItemId();
    if (id==R.id.next)
    {

    }
    else if(id==R.id.today){}

    else if (id == R.id.monday) { }
    else if (id == R.id.tuesday) { }
    else if (id == R.id.wednesday) {}
    else if (id == R.id.thursday) {

    } else if (id == R.id.friday) {

    } else if (id == R.id.saturday) {

    } else if (id == R.id.sunday) {

    }

    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    drawer.closeDrawer(GravityCompat.START);
    return true;
}


}

标签页

  public tabsPager(FragmentManager fm) {
    super(fm);
}





@Nullable
@Override
public CharSequence getPageTitle(int position) {
    return titles[position];
}


public void set(int selectedNavigationMenuID) { MessActivity.selectedNavigationMenuID = selectedNavigationMenuID; }



@Override
public Fragment getItem(int position) {
    switch (position) {



        case 0:set(MessActivity.selectedNavigationMenuID);
            BreakfastFragment breakfastFragment=new BreakfastFragment();
            return breakfastFragment;
        case 1:set(MessActivity.selectedNavigationMenuID);
            LunchFragment lunchFragment=new LunchFragment();
            return lunchFragment;
        case 2:set(MessActivity.selectedNavigationMenuID);
            DinnerFragment dinnerFragment=new DinnerFragment();
            return dinnerFragment;
    }
    return  null;
}

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

BreakFastFragment

public class BreakfastFragment extends Fragment {


public BreakfastFragment() {
    // Required empty public constructor
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View inf = inflater.inflate(R.layout.fragment_breakfast, container, false);

    TextView tv = (TextView) inf.findViewById(R.id.breakfast_textview_id);
    if(MessActivity.selectedNavigationMenuID==0)
    {

        tv.setText("now");}
    else if(MessActivity.selectedNavigationMenuID==1)
    {
        tv.setText("B_today");}
    else if(MessActivity.selectedNavigationMenuID==2)
    {
        tv.setText("B_monday");}
    else if(MessActivity.selectedNavigationMenuID==3)
    {
        tv.setText("B-tuesday");}
    else if(MessActivity.selectedNavigationMenuID==4)
    {
        tv.setText("B-wednesday");}
    else if(MessActivity.selectedNavigationMenuID==5)
    {
        tv.setText("B-thursday");}
    else if(MessActivity.selectedNavigationMenuID==6)
    {
        tv.setText("b-friday");}
    else if(MessActivity.selectedNavigationMenuID==7)
    {
        tv.setText("b-saturday");}
    else if(MessActivity.selectedNavigationMenuID==8)
    {
        tv.setText("b-sunday");}

    return inf;



}


}

【问题讨论】:

    标签: android android-fragments android-tablayout navigation-drawer


    【解决方案1】:

    对于 Tabs Selected Item,使用 viewpager.getCurrentItem() 很简单 但是要获取navigationview的选中项有两种方式

    1. 使用全局变量来保存id

      public class MessActivity extends AppCompatActivityimplements NavigationView.OnNavigationItemSelectedListener {
      public static int selectedNavigationMenuID= 0; //assuming the first item will be selected by default.
      public boolean onNavigationItemSelected(MenuItem item) {
          selectedNavigationMenuID=item.getItemId();
      }
      

      }

    2. 使用从导航视图返回所选位置的方法

      private int getCheckedItem(NavigationView navigationView) {
      Menu menu = navigationView.getMenu();
      for (int i = 0; i < menu.size(); i++) {
          MenuItem item = menu.getIndex(i);
          if (item.isChecked()) {
              return i;
          }
      }
      return -1;
      }
      

    新代码来了

    活动

        public class MessActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener {
        private SectionsPagerAdapter mSectionsPagerAdapter;
        private ViewPager viewPager;
        private Toolbar toolbar;
        private TabLayout tablayout;
        private DrawerLayout drawer;
        private String selectedNavMenu;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_mess);
    
            toolbar = (Toolbar) findViewById(R.id.toolbar);
            setSupportActionBar(toolbar);
            viewPager = (ViewPager) findViewById(R.id.container);
            drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
            NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
            navigationView.setNavigationItemSelectedListener(this);
            selectedNavMenu = "Monday" ;//setting default value
            mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager(), selectedNavMenu);
            viewPager.setAdapter(mSectionsPagerAdapter);
            ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
                    this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
            drawer.addDrawerListener(toggle);
            toggle.syncState();
            tablayout = (TabLayout) findViewById(R.id.tabs);
            viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tablayout));
            tablayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
                @Override
                public void onTabSelected(TabLayout.Tab tab) {
                    if (tab.getPosition() == 1) {
                        toolbar.setBackgroundColor(ContextCompat.getColor(MessActivity.this,
                                R.color.colorAccent));
                        tablayout.setBackgroundColor(ContextCompat.getColor(MessActivity.this,
                                R.color.colorAccent));
                        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                            getWindow().setStatusBarColor(ContextCompat.getColor(MessActivity.this,
                                    R.color.colorAccent));
                        }
                    } else if (tab.getPosition() == 2) {
                        toolbar.setBackgroundColor(ContextCompat.getColor(MessActivity.this,
                                android.R.color.darker_gray));
                        tablayout.setBackgroundColor(ContextCompat.getColor(MessActivity.this,
                                android.R.color.darker_gray));
                        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                            getWindow().setStatusBarColor(ContextCompat.getColor(MessActivity.this,
                                    android.R.color.darker_gray));
                        }
                    } else {
                        toolbar.setBackgroundColor(ContextCompat.getColor(MessActivity.this,
                                R.color.colorPrimary));
                        tablayout.setBackgroundColor(ContextCompat.getColor(MessActivity.this,
                                R.color.colorPrimary));
                        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                            getWindow().setStatusBarColor(ContextCompat.getColor(MessActivity.this,
                                    R.color.colorPrimaryDark));
                        }
                    }
                    //Here so that even if ur fragment is regenerated you get the latest value of the selectedNavigationItem
                    mSectionsPagerAdapter.getItem(viewPager.getCurrentItem()).setSelectedNavigationItem(selectedNavMenu);
                }
    
                @Override
                public void onTabUnselected(TabLayout.Tab tab) {
    
                }
    
                @Override
                public void onTabReselected(TabLayout.Tab tab) {
    
                }
            });
        }
        @Override
        public boolean onNavigationItemSelected(@NonNull MenuItem item) {
            selectedNavMenu = (String) item.getTitle();
            //Just so that new created fragment will get the latest value
            mSectionsPagerAdapter.selectedNavigationMenuText = selectedNavMenu;
            mSectionsPagerAdapter.getItem(viewPager.getCurrentItem()).setSelectedNavigationItem(selectedNavMenu);
            drawer.closeDrawer(GravityCompat.START);
            return true;
        }
    }
    

    PagerAdapter

    public class SectionsPagerAdapter extends FragmentPagerAdapter {
    
    SparseArray<PlaceholderFragment> sparseArray = new SparseArray<>();
    String selectedNavigationMenuText;
    
    public SectionsPagerAdapter(FragmentManager fm, String selectedNavigationMenuText) {
        super(fm);
        this.selectedNavigationMenuText = selectedNavigationMenuText;
    }
    
    @Override
    public PlaceholderFragment getItem(int position) {
        try {
            if (sparseArray.valueAt(position) != null) {
                return sparseArray.get(position);
            } else {
                PlaceholderFragment placeHolderFragment = PlaceholderFragment.newInstance(position, selectedNavigationMenuText);
                sparseArray.put(position, placeHolderFragment);
                return placeHolderFragment;
            }
        } catch (Throwable throwable) {
            PlaceholderFragment placeHolderFragment = PlaceholderFragment.newInstance(position, selectedNavigationMenuText);
            sparseArray.put(position, placeHolderFragment);
            return placeHolderFragment;
        }
    }
    
    @Override
    public int getCount() {
        return 3;
    }
    }
    

    片段

    public class PlaceholderFragment extends Fragment {
    private static final String ARG_SECTION_NUMBER = "section_number";
    private static final String SELECTED_NAVIGATION_ITEM = "selectedTab";
    private int selecteTabItem;
    private TextView textView;
    private String selectedMenuItem;
    
    public PlaceholderFragment() {
    }
    
    public static PlaceholderFragment newInstance(int sectionNumber, String selectedNavigationItem) {
        PlaceholderFragment fragment = new PlaceholderFragment();
        Bundle args = new Bundle();
        args.putInt(ARG_SECTION_NUMBER, sectionNumber);
        args.putString(SELECTED_NAVIGATION_ITEM, selectedNavigationItem);
        fragment.setArguments(args);
        return fragment;
    }
    
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_mess, container, false);
        textView = rootView.findViewById(R.id.section_label);
        selecteTabItem = getArguments().getInt(ARG_SECTION_NUMBER);
        selectedMenuItem = getArguments().getString(SELECTED_NAVIGATION_ITEM);
        setText();
        return rootView;
    }
    
    private void setText() {
        switch (selecteTabItem) {
            case 0:
                textView.setText("BREAKFAST : " + selectedMenuItem);
                break;
            case 1:
                textView.setText("LUNCH : " + selectedMenuItem);
                break;
            case 2:
                textView.setText("DINNER : " + selectedMenuItem);
                break;
    
        }
    }
    
    public void setSelectedNavigationItem(String selectedMenuItem) {
        this.selectedMenuItem = selectedMenuItem;
        setText();
    }
    }
    

    【讨论】:

    • 你找到解决方案了吗?
    • 在 OnTabSelected 方法中,添加 viewPager.setCurrentItem(tab.getPosition());解决了问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-20
    • 1970-01-01
    相关资源
    最近更新 更多