2013-04-23 3 views
0

У меня есть вкладки, в одной вкладке есть ListFragment с onListItemClick. Когда вы нажимаете один элемент, отображается еще ListFragment, так что это нормально работает. Тот же самый onListItemClick, как первый для ListFragment, реализован во втором ListFragment.ListFragment и onListItemClick не работает

EDIT: это, как я пытался изменить 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; 
private final Bundle mArgs; 


public CustomTabListener(Activity activity, String tag, Class<T> clz) { 
    this(activity, tag, clz, null); 
} 

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


    // Check to see if we already have a fragment for this tab, probably 
    // from a previously saved state. If so, deactivate it, because our 
    // initial state is that a tab isn't shown. 
    mFragment = mActivity.getFragmentManager().findFragmentById(android.R.id.content); 
    if (mFragment != null && !mFragment.isDetached()) { 
     FragmentTransaction ft = mActivity.getFragmentManager().beginTransaction(); 
     ft.hide(mFragment); 
     ft.commit(); 
    } 
} 

@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(), mArgs); 
     ft.add(android.R.id.content, mFragment, mTag); 
    }else{ 
     ft.show(mFragment); 
    } 
} 

@Override 
public void onTabUnselected(Tab tab, FragmentTransaction ft) { 
mActivity.getFragmentManager().findFragmentByTag(mTag); 

    if(mFragment!=null){ 
     ft.hide(mFragment); 
     } 
    } 
} 

Теперь сбои приложения, если я нажму на элемент в первом списке. LogCat говорит:

04-24 16:00:37.161: E/AndroidRuntime(9421): FATAL EXCEPTION: main 
04-24 16:00:37.161: E/AndroidRuntime(9421): java.lang.ClassCastException: com.example.easysave.InfoFragment cannot be cast to android.app.ListFragment 
04-24 16:00:37.161: E/AndroidRuntime(9421):  at com.example.easysave.KategorierFragment.onListItemClick(KategorierFragment.java:66) 
04-24 16:00:37.161: E/AndroidRuntime(9421):  at android.app.ListFragment$2.onItemClick(ListFragment.java:160) 
04-24 16:00:37.161: E/AndroidRuntime(9421):  at android.widget.AdapterView.performItemClick(AdapterView.java:298) 
04-24 16:00:37.161: E/AndroidRuntime(9421):  at android.widget.AbsListView.performItemClick(AbsListView.java:1100) 
04-24 16:00:37.161: E/AndroidRuntime(9421):  at android.widget.AbsListView$PerformClick.run(AbsListView.java:2749) 
04-24 16:00:37.161: E/AndroidRuntime(9421):  at android.widget.AbsListView$1.run(AbsListView.java:3423) 
04-24 16:00:37.161: E/AndroidRuntime(9421):  at android.os.Handler.handleCallback(Handler.java:725) 
04-24 16:00:37.161: E/AndroidRuntime(9421):  at android.os.Handler.dispatchMessage(Handler.java:92) 
04-24 16:00:37.161: E/AndroidRuntime(9421):  at android.os.Looper.loop(Looper.java:137) 
04-24 16:00:37.161: E/AndroidRuntime(9421):  at android.app.ActivityThread.main(ActivityThread.java:5041) 
04-24 16:00:37.161: E/AndroidRuntime(9421):  at java.lang.reflect.Method.invokeNative(Native Method) 
04-24 16:00:37.161: E/AndroidRuntime(9421):  at java.lang.reflect.Method.invoke(Method.java:511) 
04-24 16:00:37.161: E/AndroidRuntime(9421):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
04-24 16:00:37.161: E/AndroidRuntime(9421):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
04-24 16:00:37.161: E/AndroidRuntime(9421):  at dalvik.system.NativeStart.main(Native Method) 

У меня есть две проблемы:

  1. Когда я нажал один пункт в первом ListFragment отображается, а затем перейти на другую вкладку, список не скрывает.

  2. (Solved) Когда я нажал один элемент в первом ListFragment, который отображается, а затем нажмите на другом ListFragment, приложение выйдет из строя.

То, что я хотел бы иметь, когда второй ListFragment щелкают фрагмент с простым текстом в нем, а не список.

Я делаю это неправильно? Кто знает?

Задача 2 решается:

комментарием setContentView в главном изменении

все ListFragment ток = (ListFragment) fm.findFragmentByTag (GetTag()); и ft.add (R.id.Frame, mFragment); to Listfragment current = (ListFragment) fm.findFragmentById (android.R.id.content); и ft.add (android.R.id.содержание, mFragment);

и, наконец, изменение этого в PlaneraFragment:

public class PlaneraFragment extends Fragment{ 

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

    /** Inflating the layout country_details_fragment_layout to the view object v */ 
    View v = inflater.inflate(R.layout.planera_fragment, null); 

    /** Getting the textview object of the layout to set the details */ 
    TextView tv = (TextView) v.findViewById(R.id.text_planera); 

    /** Getting the clicked item's position and setting corresponding details in the textview of the detailed fragment */ 
    tv.setText("Hej "); 

    return v; 
    } 

} 

Мой код:

Главная

package com.example.easysave; 

import android.os.Bundle; 
import android.app.ActionBar; 
import android.app.Activity; 
import android.app.ActionBar.Tab; 

public class MainActivity extends Activity { 

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

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

KategorierFragment

package com.example.easysave; 

import android.app.Fragment; 
import android.app.FragmentManager; 
import android.app.FragmentTransaction; 
import android.app.ListFragment; 
import android.os.Bundle; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.ListView; 

public class KategorierFragment extends ListFragment { 

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


@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.findFragmentByTag(getTag()); 

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

MatFragment

package com.example.easysave; 

import android.app.Fragment; 
import android.app.FragmentManager; 
import android.app.FragmentTransaction; 
import android.app.ListFragment; 
import android.os.Bundle; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.ListView; 

public class MatFragment extends ListFragment{ 

String mat[] = {"Planera", "Storkok"}; 

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

@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 MatFragment(); 
    switch(position){ 
    case 0: 
     mFragment = new PlaneraFragment(); 
     break; 
    case 1: 
     mFragment = new StorkokFragment(); 
     break; 
    } 

    FragmentManager fm = getFragmentManager(); 
    FragmentTransaction ft = fm.beginTransaction(); 
    ListFragment current = (ListFragment) fm.findFragmentByTag(getTag()); 
    if(current == null) 
    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); 
    }  
} 

CustonTabListener

package com.example.easysave; 

import android.app.Activity; 
import android.app.Fragment; 
import android.app.FragmentTransaction; 
import android.app.ActionBar.Tab; 
import android.app.ActionBar.TabListener; 

public class CustomTabListener<T extends Fragment> implements TabListener { 

//deklarerar variabler mm 
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(R.id.Frame, mFragment, mTag); 
    }else{ 
     ft.attach(mFragment); 
    } 
} 

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

    if(mFragment!=null) 
     ft.detach(mFragment); 
    } 
} 

PlaneraFragment

package com.example.easysave; 

import android.app.Fragment; 
import android.os.Bundle; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.TextView; 

public class PlaneraFragment extends Fragment{ 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    View view = inflater.inflate(R.layout.planera_fragment, container, false); 

    TextView text = (TextView) getActivity().findViewById(R.id.text_planera); 
    text.setText("Hello there!"); 

    return view; 
    } 

} 

planera_fragment

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

<TextView 
    android:textIsSelectable="false" 
    android:id="@+id/text_planera" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:orientation="vertical"/> 

</LinearLayout> 
+0

Является ошибкой в ​​каждом отправленном вами коде или может быть упрощен для нас? –

+0

и кстати. http://stackoverflow.com/questions/7274231/listfragment-onlistitemclick-not-being-called –

+0

Я исправил вторую проблему. Нет ошибки, я попробую снова объяснить первую проблему. Я нахожусь на «Kategorier» -Tab, нажав на один элемент в списке, будет показан другой список, а последний будет скрыт. Но если я затем перейду на другую вкладку, список из «Kategorier» -Tab не скроется. Он показывает два фрагмента поверх каждого другого. Я посмотрел на это: http://stackoverflow.com/questions/10502786/switching-fragments-within-tab и попытался изменить свой вкладчик, как этот человек, но без успеха. – user2307292

ответ

0

Вы должны выяснить, как следует обращаться с вкладки. Вы прикрепляете и отключаете в своем вкладке TabListener, но показываете и скрываете при нажатии на ListView.

Вы либо отсоединяете все свои текущие фрагменты, а затем присоединяете новый или меняете вкладчиков на .show() и .hide().

EDIT: Согласно последнему комментарию в this answer, есть хороший пример сохранения истории вкладок при переключении между вкладками.

Следующая реализация TabListener проста, но не сохранит ваш задний стек. При переключении на другую вкладку вы не выбираете ее для скрытия. Это просто гладит его и отделяет все это.

@Override 
public void onTabSelected(Tab tab, FragmentTransaction ft) { 
    mFragment = Fragment.instantiate(mActivity, mClass.getName()); 
    ft.replace(android.R.id.content, mFragment, mTag); 
} 

@Override 
public void onTabUnselected(Tab tab, FragmentTransaction ft) { 
    if (mFragment != null) 
     ft.detach(mFragment); 
    } 
} 
+0

Итак, я изменил свой TabListenter, но теперь приложение падает, если я нажимаю элемент в первом списке. Я добавлю CustomTabListener в текст, чтобы вы могли видеть, что я сделал. – user2307292

+0

Предоставьте свои журналы регистрации. – jwong

+0

Они находятся почти в верхней части страницы. – user2307292

Смежные вопросы