Android 创建顶部导航菜单
如何根据屏幕截图制作顶部导航菜单 我希望顶部链接是可点击和滚动的,因为顶部导航中有更多的项目Android 创建顶部导航菜单,android,kotlin,Android,Kotlin,如何根据屏幕截图制作顶部导航菜单 我希望顶部链接是可点击和滚动的,因为顶部导航中有更多的项目 实现xml视图,如: - CoordinatorLayout - LinearLayout - Toolbar - TabLayout - View Pager activity_main.xml 然后,在“活动/片段设置”视图页面和“表格布局”中,在“视图页面”中添加片段,并在“视图页面”片段中准备“回收器”视图 private TabLayout tabLayout;
实现xml视图,如:
- CoordinatorLayout
- LinearLayout
- Toolbar
- TabLayout
- View Pager
activity_main.xml
然后,在“活动/片段设置”视图页面和“表格布局”中,在“视图页面”中添加片段,并在“视图页面”片段中准备“回收器”视图
private TabLayout tabLayout;
private ViewPager viewPager;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.your_layout);
initialiseViews();
setUpTabLayout();
}
public void initialiseViews() {
tabLayout = (TabLayout) findViewById(tab_layout);
viewPager = (ViewPager) findViewById(R.id.view_pager);
}
private void setUpTabLayout() {
ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
adapter.add(new YourFragment1(), "Home");
adapter.add(new YourFragment2(), "Trending");
adapter.add(new YourFragment3(), "Friends");
viewPager.setAdapter(adapter);
viewPager.setPageMargin((int) getResources().getDimension(R.dimen.view_pager_gap));
viewPager.setPageMarginDrawable(R.color.background);
viewPager.setOffscreenPageLimit(2);
tabLayout.setupWithViewPager(viewPager);
}
private class ViewPagerAdapter extends FragmentPagerAdapter {
private List<Fragment> fragmentList = new ArrayList<>();
private List<String> titleList = new ArrayList<>();
private ViewPagerAdapter(FragmentManager fm) {
super(fm);
}
void add(Fragment fragment, String title) {
fragmentList.add(fragment);
titleList.add(title);
}
@Override
public Fragment getItem(int position) {
return fragmentList.get(position);
}
@Override
public CharSequence getPageTitle(int position) {
return titleList.get(position);
}
@Override
public int getCount() {
return fragmentList.size();
}
@Override
public int getItemPosition(Object object) {
return POSITION_NONE;
}
}
您必须使用TabLayout和ViewPager来创建如上所述的用户界面。 请参阅: 还有一些开源github项目 例如:
我还看到了导航按钮,它通常在屏幕上操作NavigationDrawer,我想您将来可能需要它 为了实现您所说的最佳方法,您应该首先通过显示一些代码等来描述您正在使用的架构 让我们假设您将以常见的方式使用holder活动和少量页面。然后,基本上,您需要的是ViewPager的自定义适配器: 首先,您需要正确的布局,如下所示:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="#464646"
app:layout_scrollFlags="scroll|enterAlways|snap"
app:popupTheme="@style/ThemeOverlay.AppCompat.Dark"
app:theme="@style/AppTheme"
app:titleTextColor="#e1e1e1" />
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
tools:context=".ui.main.MainActivity">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<android.support.design.widget.TabLayout
android:id="@+id/tabLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#606060"
android:minHeight="?attr/actionBarSize"
android:theme="@style/AppTheme" />
<android.support.v4.view.ViewPager
android:id="@+id/viewPager"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
<FrameLayout
android:id="@+id/content_frame"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<android.support.design.widget.NavigationView
android:id="@+id/navigation_view"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
app:headerLayout="@layout/drawer_header"
app:menu="@menu/drawer_menu_general" />
</android.support.v4.widget.DrawerLayout>
</LinearLayout>
我不会解释你构建这段代码所需的每一步,因为有很多Tuto可以解释整个概念,但我直接鼓励你用谷歌搜索它,以避免将来碎片堆栈或标准android组件可能出现的问题。最好的方法是自己研究并展示一些努力。如果您不知道,建议在堆栈溢出上只出现基于代码和/或错误的问题。至于你的答案,请研究查看寻呼机和片段;查看此链接:您应该将TabLayout与ViewPager一起使用。请参阅下面的链接:访问此链接
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="#464646"
app:layout_scrollFlags="scroll|enterAlways|snap"
app:popupTheme="@style/ThemeOverlay.AppCompat.Dark"
app:theme="@style/AppTheme"
app:titleTextColor="#e1e1e1" />
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
tools:context=".ui.main.MainActivity">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<android.support.design.widget.TabLayout
android:id="@+id/tabLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#606060"
android:minHeight="?attr/actionBarSize"
android:theme="@style/AppTheme" />
<android.support.v4.view.ViewPager
android:id="@+id/viewPager"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
<FrameLayout
android:id="@+id/content_frame"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<android.support.design.widget.NavigationView
android:id="@+id/navigation_view"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
app:headerLayout="@layout/drawer_header"
app:menu="@menu/drawer_menu_general" />
</android.support.v4.widget.DrawerLayout>
</LinearLayout>
class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelectedListener {
private val pageTitles = arrayOf("TITLE_ONE", "TITLE_TWO")
private lateinit var mDrawer: DrawerLayout
private lateinit var mNavigationView: NavigationView
private lateinit var mDrawerToggle: ActionBarDrawerToggle
private lateinit var mActionBar: ActionBar
private var mToolBarNavigationListenerIsRegistered = false
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
mDrawer = findViewById(R.id.drawer_layout)
val toolbar: Toolbar = findViewById(R.id.toolbar)
setSupportActionBar(toolbar)
mActionBar = supportActionBar!!
for (i in 0..YOUR_VIEWS_COUNT) { tabLayout.addTab(tabLayout.newTab().setText(pageTitles[i])) }
tabLayout.tabGravity = TabLayout.GRAVITY_FILL
mDrawerToggle = ActionBarDrawerToggle(this, mDrawer, toolbar,
R.string.navigation_drawer_open, R.string.navigation_drawer_close)
mDrawer.addDrawerListener(mDrawerToggle)
mDrawerToggle.syncState()
mNavigationView = findViewById(R.id.navigation_view)
mNavigationView.setNavigationItemSelectedListener(this)
val pagerAdapter = ViewPagerAdapter(supportFragmentManager)
viewPager.adapter = pagerAdapter
viewPager.addOnPageChangeListener(TabLayout.TabLayoutOnPageChangeListener(tabLayout))
tabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener {
override fun onTabSelected(tab: TabLayout.Tab) {
viewPager.currentItem = tab.position
}
override fun onTabUnselected(tab: TabLayout.Tab) {}
override fun onTabReselected(tab: TabLayout.Tab) {}
})
if(savedInstanceState != null){
resolveUpButtonWithFragmentStack()
} else {
}
}
override fun onNavigationItemSelected(item: MenuItem): Boolean {
when(item.itemId){
R.id.your_first_item_view -> {
supportFragmentManager.beginTransaction().hide(getCurrentFragment())
.add(R.id.content_frame, YourFragment(), Integer.toString(getFragmentCount()))
.addToBackStack("fragBack").commit()
showUpButton(true)
title = "YourFragment"
}
}
mDrawer.closeDrawer(GravityCompat.START)
return true
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
when (item.itemId) {
android.R.id.home -> {
mDrawer.openDrawer(GravityCompat.START)
return true
}
}
return super.onOptionsItemSelected(item)
}
override fun onBackPressed() {
if (mDrawer.isDrawerOpen(GravityCompat.START)) {
mDrawer.closeDrawer(GravityCompat.START)
} else {
val backStackCount = getFragmentCount()
if (backStackCount >= 1) {
supportFragmentManager.popBackStack()
if (backStackCount == 1) {
showUpButton(false)
}
} else {
super.onBackPressed()
}
}
}
private fun showUpButton(show: Boolean) {
if (show) {
mDrawerToggle.isDrawerIndicatorEnabled = false
mActionBar.setDisplayHomeAsUpEnabled(true)
if (!mToolBarNavigationListenerIsRegistered) {
mDrawerToggle.toolbarNavigationClickListener = View.OnClickListener { onBackPressed() }
mToolBarNavigationListenerIsRegistered = true
}
} else {
mActionBar.setDisplayHomeAsUpEnabled(false)
mDrawerToggle.isDrawerIndicatorEnabled = true
mDrawerToggle.toolbarNavigationClickListener = null
mToolBarNavigationListenerIsRegistered = false
}
}
private fun resolveUpButtonWithFragmentStack() {
showUpButton(supportFragmentManager.backStackEntryCount > 0)
}
fun getFragmentCount(): Int {
return supportFragmentManager.backStackEntryCount
}
fun getFragmentAt(index: Int): Fragment {
return if (getFragmentCount() > 0)
supportFragmentManager.findFragmentByTag(Integer.toString(index)) else NearbyPlaceTypesFragment()
}
fun getCurrentFragment(): Fragment {
return getFragmentAt(getFragmentCount() - 1)
}
// Your adapter for ViewPager
class ViewPagerAdapter(val fragmentManager: FragmentManager) : FragmentStatePagerAdapter(fragmentManager) {
override fun getItem(position: Int): Fragment {
return when (position) {
0 -> {
YourFragment()
}
else -> {
YourOtherFragment()
}
}
}
override fun getCount(): Int {
return 2
}
}
}