Java 如何实现onlistitemclick以使其从一个listfragment切换到另一个listfragment?

Java 如何实现onlistitemclick以使其从一个listfragment切换到另一个listfragment?,java,android,Java,Android,我试图实现一个选项卡中列表的侦听器,当您单击一个listitem时,我想从显示的ListFragment切换到另一个ListFragment 现在,第二个listfragment打开了,但第一个仍然在后台。我如何解决这个问题 有人愿意帮助新手吗 当单击第一个列表中的一个项目时,应用程序崩溃,日志显示: 04-22 18:51:47.359: D/dalvikvm(614): Not late-enabling CheckJNI (already on) 04-22 18:51:47.840: E

我试图实现一个选项卡中列表的侦听器,当您单击一个listitem时,我想从显示的ListFragment切换到另一个ListFragment

现在,第二个listfragment打开了,但第一个仍然在后台。我如何解决这个问题

有人愿意帮助新手吗

当单击第一个列表中的一个项目时,应用程序崩溃,日志显示:

04-22 18:51:47.359: D/dalvikvm(614): Not late-enabling CheckJNI (already on)
04-22 18:51:47.840: E/Trace(614): error opening trace file: No such file or directory (2)
04-22 18:51:48.510: D/dalvikvm(614): GC_FOR_ALLOC freed 69K, 3% free 8052K/8259K, paused 34ms, total 38ms
04-22 18:51:48.520: I/dalvikvm-heap(614): Grow heap (frag case) to 8.498MB for 614416-byte allocation
04-22 18:51:48.659: D/dalvikvm(614): GC_CONCURRENT freed 1K, 3% free 8651K/8903K, paused 86ms+23ms, total 136ms
04-22 18:51:48.809: D/gralloc_goldfish(614): Emulator without GPU emulation detected.
04-22 18:51:52.110: I/Choreographer(614): Skipped 43 frames!  The application may be doing too much work on its main thread.
04-22 18:52:02.020: D/AndroidRuntime(614): Shutting down VM
04-22 18:52:02.020: W/dalvikvm(614): threadid=1: thread exiting with uncaught exception (group=0x40a13300)
04-22 18:52:02.060: E/AndroidRuntime(614): FATAL EXCEPTION: main
04-22 18:52:02.060: E/AndroidRuntime(614): java.lang.NullPointerException
04-22 18:52:02.060: E/AndroidRuntime(614):  at android.app.BackStackRecord.run(BackStackRecord.java:609)
04-22 18:52:02.060: E/AndroidRuntime(614):  at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1397)
04-22 18:52:02.060: E/AndroidRuntime(614):  at android.app.FragmentManagerImpl$1.run(FragmentManager.java:426)
04-22 18:52:02.060: E/AndroidRuntime(614):  at android.os.Handler.handleCallback(Handler.java:615)
04-22 18:52:02.060: E/AndroidRuntime(614):  at android.os.Handler.dispatchMessage(Handler.java:92)
04-22 18:52:02.060: E/AndroidRuntime(614):  at android.os.Looper.loop(Looper.java:137)
04-22 18:52:02.060: E/AndroidRuntime(614):  at android.app.ActivityThread.main(ActivityThread.java:4745)
04-22 18:52:02.060: E/AndroidRuntime(614):  at java.lang.reflect.Method.invokeNative(Native Method)
04-22 18:52:02.060: E/AndroidRuntime(614):  at java.lang.reflect.Method.invoke(Method.java:511)
04-22 18:52:02.060: E/AndroidRuntime(614):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
04-22 18:52:02.060: E/AndroidRuntime(614):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
04-22 18:52:02.060: E/AndroidRuntime(614):  at dalvik.system.NativeStart.main(Native Method)
04-22 18:52:04.049: I/Process(614): Sending signal. PID: 614 SIG: 9
这是我的密码: 主要内容:

公共类MainActivity扩展活动{
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
ActionBar ActionBar=getActionBar();
actionBar.setNavigationMode(actionBar.NAVIGATION\u MODE\u选项卡);
actionBar.setDisplayShowTitleEnabled(true);
Tab Tab=actionBar.newTab().setText(“Kategorier”)
.setTableListener(新的CustomTableListener(这是“kategorier”,KategorierFragment.class));
actionBar.addTab(tab);
tab=actionBar.newTab().setText(“profile”)
.setTableListener(新的CustomTableListener(这个“profil”,ProfilFragment.class));
actionBar.addTab(tab);
tab=actionBar.newTab().setText(“信息”)
.setTabListener(新的CustomTabListener(这个“info”,InfoFragment.class));
actionBar.addTab(tab);
}
}
自定义列表器

public class CustomTabListener<T extends Fragment> implements TabListener {

private Fragment mFragment;
private final Activity mActivity;
private final String mTag;
private final Class<T> mClass;

public CustomTabListener(Activity activity, String tag, Class<T> clz){
    mActivity = activity;
    mTag = tag;
    mClass = clz;
}

@Override
public void onTabReselected(Tab tab, FragmentTransaction ft) {

}

@Override
public void onTabSelected(Tab tab, FragmentTransaction ft) {

    if(mFragment==null){
        mFragment = Fragment.instantiate(mActivity, mClass.getName());
        ft.add(android.R.id.content, mFragment, mTag);
    }else{
        ft.attach(mFragment);
    }
}

@Override
public void onTabUnselected(Tab tab, FragmentTransaction ft) {
    if(mFragment!=null)
        ft.detach(mFragment);
    }
}
公共类CustomTabListener实现TabListener{
私人碎片;
私人最终活动能力;
私有最终字符串mTag;
私人期末班;
公共CustomTableListener(活动、字符串标记、类clz){
活动性=活动性;
mTag=标签;
mClass=clz;
}
@凌驾
已重新选择公共无效页签(页签,碎片事务){
}
@凌驾
已选择的公共事务(选项卡,碎片事务ft){
if(mFragment==null){
MFFragment=Fragment.instantiate(mActivity,mClass.getName());
ft.add(android.R.id.content、mFragment、mTag);
}否则{
ft.attach(mFragment);
}
}
@凌驾
已选择公共空页(选项卡,碎片事务ft){
if(mFragment!=null)
ft.分离(mFragment);
}
}
第一个选项卡下显示的listfragment:

public class KategorierFragment extends ListFragment {

String kategorier[] = new String[]{
         "Mat","El","Resor","Aktiviteter","Övrigt"};

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

    ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity().getBaseContext(), android.R.layout.simple_selectable_list_item, kategorier);
    setListAdapter(adapter);
    return super.onCreateView(inflater, container, savedInstanceState);
}

    @Override
public void onListItemClick(ListView l, View v, int position, long id) {
    // TODO Auto-generated method stub
    super.onListItemClick(l, v, position, id);

    Fragment mFragment = new KategorierFragment();
    switch(position){
    case 0:
        mFragment = new MatFragment();
        break;
    case 1:
        mFragment = new ElFragment();
        break;
    case 2:
        mFragment = new ResorFragment();
        break;
    case 3:
        mFragment = new AktiviteterFragment();
        break;
    case 4:
        mFragment = new AnnatFragment();
        break;

    }

    FragmentManager fm = getFragmentManager();
    FragmentTransaction ft = fm.beginTransaction();
    ListFragment current = (ListFragment) fm.findFragmentById(R.id.Frame);
    ft.add(R.id.Frame, mFragment);
    ft.addToBackStack(null);
    ft.hide(current);
    ft.commit();
    }
}


@Override
public void onStart() {
    super.onStart();
    getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE);
    }
} 
公共类KategorierFragment扩展了ListFragment{
字符串kategorier[]=新字符串[]{
“Mat”、“El”、“Resor”、“Aktiviter”、“Övrigt”};
@凌驾
CreateView上的公共视图(布局、充气机、视图组容器、捆绑包保存状态){
ArrayAdapter=新的ArrayAdapter(getActivity().getBaseContext(),android.R.layout.simple\u可选\u列表\u项,kategorier);
setListAdapter(适配器);
返回super.onCreateView(充气机、容器、savedInstanceState);
}
@凌驾
public void onListItemClick(列表视图l、视图v、整数位置、长id){
//TODO自动生成的方法存根
super.onListItemClick(左、右、位置、id);
片段MFFragment=新的KategorierFragment();
开关(位置){
案例0:
mffragment=新的MatFragment();
打破
案例1:
MFFragment=新的ElFragment();
打破
案例2:
mFragment=新的共振片();
打破
案例3:
MFFragment=新的AktiviterFragment();
打破
案例4:
mFragment=新的AnnatFragment();
打破
}
FragmentManager fm=getFragmentManager();
FragmentTransaction ft=fm.beginTransaction();
ListFragment当前=(ListFragment)fm.findFragmentById(R.id.Frame);
ft.add(R.id.Frame,mFragment);
ft.addToBackStack(空);
ft.hide(当前);
ft.commit();
}
}
@凌驾
public void onStart(){
super.onStart();
getListView().setChoiceMode(ListView.CHOICE\u MODE\u SINGLE);
}
} 
我要切换到的第一个listfragment:

public class MatFragment extends ListFragment{

String mat[] = {"Tips1", "Tips2", "Tips3", "Tips4", "Tips5", "Tips6", "Tips7"};


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    // TODO Auto-generated method stub

     ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity().getBaseContext(), android.R.layout.simple_selectable_list_item, mat);
     setListAdapter(adapter);

    return super.onCreateView(inflater, container, savedInstanceState);
    }
}
公共类MatFragment扩展了ListFragment{
弦垫[]={“Tips1”、“Tips2”、“Tips3”、“Tips4”、“Tips5”、“Tips6”、“Tips7”};
@凌驾
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState){
//TODO自动生成的方法存根
ArrayAdapter=新的ArrayAdapter(getActivity().getBaseContext(),android.R.layout.simple\u可选\u列表\u项,mat);
setListAdapter(适配器);
返回super.onCreateView(充气机、容器、savedInstanceState);
}
}

要避免列表重叠,您需要在提交事务之前隐藏上一个片段

ListFragment current = (ListFragment) fm.findFragmentById(android.R.id.content);
ft.hide(current);
如果您想使用“back”导航回最后一个片段,您可以使用

ft.add(android.R.id.content, mFragment);
ft.addToBackStack(null);
ft.hide(current);
ft.commit();

好的,我试过了,但我不确定我是否做对了,因为应用程序崩溃了。我将用代码和lagcat信息更新问题。感谢您的帮助:)删除第一个ft.hide(当前)。对不起,这两段代码并不是想让您感到困惑。它们应该是单独的例子。哦,对不起,我应该看到的。但是如果我删除那一行,应用程序仍然会失败。这只是一个复制粘贴错误,还是您的代码中有以下两个错误@重写public void onListItemClick(ListView l,View v,int position,long id){//TODO自动生成的方法存根super.onListItemClick(l,v,position,id);所以现在我已经尝试了一些方法。您给出的解决方案正在运行,如果我设置ContentView并从findFragmentById更改为findFragmentByTag,也一样。感谢所有帮助!
ft.add(android.R.id.content, mFragment);
ft.addToBackStack(null);
ft.hide(current);
ft.commit();