使用导航抽屉显示片段

问题描述:

我很困惑如何通过单击我的导航抽屉中的一个项目来打开我的不同片段。使用导航抽屉显示片段

在MainActivity我用下面的代码:

@SuppressWarnings("StatementWithEmptyBody") 
 
@Override 
 
public boolean onNavigationItemSelected(MenuItem item) { 
 
    Fragment fragment; 
 

 
    int id = item.getItemId(); 
 

 
    if (id == R.id.nav_listview) { 
 
     FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
 
     ft.replace(R.id.fragment, new ListFragment()); 
 
     ft.commit(); 
 

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

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

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

 
    } 
 

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

所有我想尝试打开我的ListFragment首先:

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

 

 
public class ListFragment extends Fragment { 
 

 

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

 
     return inflater.inflate(R.layout.fragment_list, container, false); 
 
    } 
 
}

在我的内容main.xml中,我创建了以下片段,在点击导航抽屉中的特定项目时应该替换它。

<fragment 
 
     android:layout_width="wrap_content" 
 
     android:layout_height="wrap_content" 
 
     android:id="@+id/fragment" />

但它不是工作...

谁能帮助我?

Rastaman

+0

任何错误?或者片段没有被替换? –

+0

不,我用设计工具手动添加我的fragment_list片段。现在我可以在屏幕上看到它,但是如果我点击导航抽屉中的“列表”项目,我会在片段中间获得加载循环,但没有任何反应。 – Rastaman

+0

你有没有尝试添加或实施其他片段? – Droidwala

请更改您的片段类的名称ListFragment因为ListFragment已经在android中的子类的片段。应用 Android操作系统

试试这个代码

@SuppressWarnings("StatementWithEmptyBody") 
 
@Override 
 
public boolean onNavigationItemSelected(MenuItem item) { 
 
    Fragment fragment=null; 
 
FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
 
    int id = item.getItemId(); 
 

 
    if (id == R.id.nav_listview) { 
 
     
 
     fragment= new ListFragment(); 
 
    
 

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

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

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

 
    } 
 
ft.replace(R.id.container, fragment); 
 
    ft.addToBackStack(null); 
 
    ft.commit(); 
 
    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
 
    drawer.closeDrawer(GravityCompat.START); 
 
    return true; 
 
}

<FrameLayout 
 
     android:layout_width="wrap_content" 
 
     android:layout_height="wrap_content" 
 
     android:id="@+id/container" />

+0

错误:(116,37)错误:变量片段可能未被初始化 – Rastaman

+0

我添加了: public boolean onNavigationItemSelected(MenuItem item){ 片段片段; FragmentTransaction ft = getSupportFragmentManager()。beginTransaction(); fragment = new ListFragment(); 将标准片段初始化为ListFragment。但它没有工作.. 但一般的代码似乎是正确的。我可以这样打开我的AddDataFragment。但我没有得到ListFragment的女巫... – Rastaman

MHMM我找到了答案。但我很困惑。 如果我使用:

   if (id == R.id.nav_listview) { 
 
       fragment= new com.thomas.testapp.ListFragment();

它的工作原理。但是我只需要使用包名就可以打开我的ListFragment。为什么?

+0

有一个名为“ListFragment”的官方课程。重命名后,东西工作正常。 – Rastaman

我建议创建的代码更加动态

首先,如果你有自定义的类来创建抽屉式导航,使用监听器调用从您的活动方法 有类调用HomeFragment延伸片段,所以我们有:

if(condition){ 
    fragment = new HomeFragment(); 
    // if there is Listener 
    if(mListener != null){ 
     mListener.someMethod 
    } 
    // Other Settings And Codes 
} 

为了得到你想要尝试这个东西,我还举办了这个有些复杂的看着代码,但它更多的是简单的方法来使用

下面是详细的解释,并步行穿过这个问题: (它似乎长,但你可以很容易地涉及尽快你的工作)

当你第一次创建的抽屉式导航活动,有5对文件,我们来看看:

  • MainActivity.java - 这是后面的代码为我们的应用程序的一切。
  • activity_main.xml中 - 这是该应用包括NAV抽屉布局和一个包括用于app_bar_main。
  • app_bar_main.xml - 这是带有工具栏(位于顶部),浮动操作按钮(位于右下角)和content_main的包含的布局。
  • content_main.xml - 这是主要的页面内容布局。
  • nav_header_main.xml - 这是为资产净值抽屉的顶部的UI。

第1步: 开拓app_bar_main.xml,注释掉包括并添加一个新的FrameLayout:

<!--<include layout="@layout/content_main" />--> 

<FrameLayout 
    android:id="@+id/Fragment_container" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_marginTop="?attr/actionBarSize"/> 

这是FrameLayout里我们将使用加载我们的片段成。

第2步: 接下来,您要添加一些片段 要做到这一点,右键点击你的项目,或转到文件 - >新建,并从片段列表中选择片段(空白)或其他

第3步: 下一步是在应用程序首次启动时加载一个片段。转至MainActivity的onCreate方法,并把下面的调用之后setSupportActionBar

Fragment fragment = null; 
Class fragmentClass = null; 
fragmentClass = FragmentOne.class; 
try { 
    fragment = (Fragment) fragmentClass.newInstance(); 
} catch (Exception e) { 
    e.printStackTrace(); 
} 

FragmentManager fragmentManager = getSupportFragmentManager(); 
fragmentManager.beginTransaction().replace(R.id.Fragment_container, fragment).commit(); 

第4步:

然后,您需要添加OnFragmentInteractionListener到您的MainActivity实现并且还实施onFragmentInteraction方法。像这样

public class MainActivity extends AppCompatActivity 
     implements NavigationView.OnNavigationItemSelectedListener, FragmentOne.OnFragmentInteractionListener ,FragmentTwo.OnFragmentInteractionListener,FragmentThree.OnFragmentInteractionListener { 

步骤5: 最后,在onNavigationItemSelected方法,您可以添加加载不同片段的能力时,菜单项挖掘:

public boolean onNavigationItemSelected(MenuItem item) { 
    // Handle navigation view item clicks here. 
    int id = item.getItemId(); 
    Fragment fragment = null; 
    Class fragmentClass = null; 
    if (id == R.id.nav_camera) { 
     fragmentClass = FragmentOne.class; 
    } else if (id == R.id.nav_gallery) { 
     fragmentClass = FragmentTwo.class; 
    } else if (id == R.id.nav_slideshow) { 
     fragmentClass = FragmentThree.class; 
    } else if (id == R.id.nav_manage) { 

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

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

    } 
    try { 
     fragment = (Fragment) fragmentClass.newInstance(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    FragmentManager fragmentManager = getSupportFragmentManager(); 
    fragmentManager.beginTransaction().replace(R.id.flContent, fragment).commit(); 

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

在这里,我只是装我已经添加到我的应用程序的两个片段之一。请注意,因为我有两个不同的片段,所以我必须为FragmentOne.OnFragmentInteractionListener和FragmentTwo.OnFragmentInteractionListener实现接口。

这就是你在导航抽屉中实现片段加载所需要做的。 用户点击菜单项时,抽屉会顺利滑回,并且新的片段已经开始/完成加载。这还可以防止在启动新活动时可能看到的任何可能的骚动。

注意EXTRA 最后一件事是,如果你切换到不同的片段,然后旋转该装置,或者导致活性的另一娱乐,上述代码将导致第一片段被重新加载。一个简单的方法来处理是包裹在onCreate方法的片段块进行检查,看是否savedInstanceState不为空这样的:

protected void onCreate(Bundle savedInstanceState) { 
    ... 
    if (savedInstanceState == null) { 
     //Fragment load code 
    } 
    ... 
}