gpt4 book ai didi

android - 如何从抽屉导航中打开一个新 fragment ?

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:54:05 25 4
gpt4 key购买 nike

我正在使用 developer.android.com 指南来构建应用程序。我在Android Studio新建项目时选择了“Navigation: Navigation Drawer”。我在互联网上搜索了我的问题的答案,但找不到任何有效的答案。抱歉,我是编程新手。

  1. 如何让我的应用在点击抽屉导航时在主视图中打开一个新 fragment ?
  2. 是否可以在点击抽屉导航时打开多个带有选项卡的可滑动 fragment ?
  3. 如何使“标题”可展开/折叠?

http://developer.android.com/design/patterns/navigation-drawer.html http://developer.android.com/training/implementing-navigation/nav-drawer.html

这就是我想要的布局:

My layout

title_section* 不是 section_title ;)

最佳答案

Navigation Drawer 是当今流行的新设计。在为抽屉导航 Activity 设计 xml.layout(layout) 时,我们使用两种布局:主要内容布局和抽屉列表布局。我在这里回答你所有愚蠢的问题。

How do I make my app open a new fragment in the main view when clicking in the navigation drawer?

只需在抽屉列表项上添加 clicklistener,并根据单击的列表项的位置替换主要内容中的 fragment 。

示例代码:

    // The click listener for ListView in the navigation drawer
@SuppressWarnings("unused")
private class DrawerItemClickListener implements ListView.OnItemClickListener {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
selectItem(position);
}
}

private void selectItem(int position) {

Fragment newFragment;
FragmentTransaction transaction = getFragmentManager().beginTransaction();

switch (position) {
case 0:
newFragment = new f1();
transaction.replace(R.id.content_frame, newFragment);
transaction.addToBackStack(null);
transaction.commit();
break;

case 1:
newFragment = new f2();
transaction.replace(R.id.content_frame, newFragment);
transaction.addToBackStack(null);
transaction.commit();
break;

case 2:
newFragment = new f3();
transaction.replace(R.id.content_frame, newFragment);
transaction.addToBackStack(null);
transaction.commit();
break;

case 3:
newFragment = new f4();
transaction.replace(R.id.content_frame, newFragment);
transaction.addToBackStack(null);
transaction.commit();
break;


}
//DrawerList.setItemChecked(position, true);
setTitle(ListTitles[position]);
DrawerLayout.closeDrawer(DrawerList);
}

这里是 f1,f2。 f3 和 f4 是不同的 fragment ,每个 fragment 都有自己的布局。您必须通过继承 fragment 类为它们创建单独的 java 类。

Is it possible to open multiple swipeable fragments with tabs when clicking in the navigation drawer?

为了在 fragment 中实现选项卡,您可以在该特定 fragment 中使用 tabhost。假设您想在 fragment f_main 中添加选项卡。

F_main.xml 的布局

<TabHost 
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/tabhost"
android:layout_width="match_parent"
android:layout_height="match_parent" >

<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >

<TabWidget
android:id="@android:id/tabs"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="0"
android:orientation="horizontal" />

<FrameLayout
android:id="@+id/tabFrameLayout"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1" />
</LinearLayout>

</TabHost>

然后制作其他 fragment f_tab1 和 f_tab2 及其相应的布局和 java 类。两个选项卡 fragment 的布局可以相同或不同。在这里,我采用相同或通用的布局。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >

<TextView android:id="@+id/google_map"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:text="MAP"/>

</LinearLayout>

F_tab1.java fragment 代码

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class F_tab1 extends Fragment {

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {

View view=inflater.inflate(R.layout.friends_list, container,false);


return view;
}

}

另一个 fragment 的代码。即 F_tab2.java

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class F_tab2 extends Fragment {

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {

View view=inflater.inflate(R.layout.friends_list, container,false);


return view;
}

}

现在只需像前面提到的那样在抽屉列表中使用 clicklistener 来在抽屉列表中的项目单击时加载 F_main,这将进一步加载主内容 View 中 F_main fragmnet 中的选项卡。

How do I make a "title" expandable/collapsible?

嗯,我不知道 NV 抽屉是否提供此功能。但它提供了一项功能,可以根据所选的抽屉项目或加载的主要内容 fragment 来切换操作栏标题。

如抽屉导航设计指南中所述,您应该在抽屉可见时修改操作栏的内容,例如更改标题并删除与主要内容相关的操作项。以下代码显示了如何通过使用 ActionBarDrawerToggle 类的实例覆盖 DrawerLayout.DrawerListener 回调方法来实现此目的,如下所示

 public class MainActivity extends Activity {
private DrawerLayout mDrawerLayout;
private ActionBarDrawerToggle mDrawerToggle;
private CharSequence mDrawerTitle;
private CharSequence mTitle;
...

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
...

mTitle = mDrawerTitle = getTitle();
mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
R.drawable.ic_drawer, R.string.drawer_open, R.string.drawer_close) {

/** Called when a drawer has settled in a completely closed state. */
public void onDrawerClosed(View view) {
getActionBar().setTitle(mTitle);
invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
}

/** Called when a drawer has settled in a completely open state. */
public void onDrawerOpened(View drawerView) {
getActionBar().setTitle(mDrawerTitle);
invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
}
};

// Set the drawer toggle as the DrawerListener
mDrawerLayout.setDrawerListener(mDrawerToggle);
}

/* Called whenever we call invalidateOptionsMenu() */
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
// If the nav drawer is open, hide action items related to the content view
boolean drawerOpen = mDrawerLayout.isDrawerOpen(mDrawerList);
menu.findItem(R.id.action_websearch).setVisible(!drawerOpen);
return super.onPrepareOptionsMenu(menu);
}
}

关于android - 如何从抽屉导航中打开一个新 fragment ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20303314/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com