簡體   English   中英

如何實現onlistitemclick使其從一個列表片段切換到另一個列表片段?

[英]How to implement onlistitemclick to make it switch from a listfragment to another listfragment?

當您單擊列表項時,我想實現對選項卡中列表的偵聽器,我想從顯示的ListFragment切換到另一個ListFragment。

現在,第二個列表片段將打開,但第一個仍在后台。 我該如何解決?

有人願意幫助新手嗎?

單擊第一個列表中的一個項目時,應用程序崩潰,LogCat說:

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

這是我的代碼:Main:

public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    ActionBar actionBar = getActionBar();
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

    actionBar.setDisplayShowTitleEnabled(true);

    Tab tab = actionBar.newTab().setText("Kategorier")
        .setTabListener(new CustomTabListener<KategorierFragment>(this, "kategorier", KategorierFragment.class));
    actionBar.addTab(tab);

    tab = actionBar.newTab().setText("Profil")
        .setTabListener(new CustomTabListener<ProfilFragment>(this, "profil", ProfilFragment.class));
    actionBar.addTab(tab);

    tab = actionBar.newTab().setText("Info")
        .setTabListener(new CustomTabListener<InfoFragment>(this, "info", InfoFragment.class));
    actionBar.addTab(tab);
    }
}

CustomTabListener

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);
    }
}

在第一個選項卡下顯示的列表片段:

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);
    }
} 

我要切換到的第一個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);
    }
}

為了繞過列表,您需要在提交事務之前隱藏上一個片段。

ListFragment current = (ListFragment) fm.findFragmentById(android.R.id.content);
ft.hide(current);

如果您想使用“返回”導航回到過去的片段,你會使用

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM