2013-04-23 65 views
0

我有选项卡,在一个选项卡中有一个ListFragmentonListItemClick。当你点击一个项目时,另一个ListFragment显示,所以这工作正常。与第一个ListFragment相同的onListItemClick实施到第二个ListFragmentListFragment和onListItemClick不工作

编辑:这是我试图改变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. (已解决)当我点击第一个ListFragment正在显示的一个项目,然后点击其他ListFragment该应用程序崩溃。

当第二个ListFragment被点击时,我想要的是一个简单的文本片段,而不是一个列表。

我这样做是错误的吗?谁知道?

问题2所解决:

评论在主

变化的setContentView所有ListFragment电流=(ListFragment)fm.findFragmentByTag(getTag());和ft.add(R.id.Frame,mFragment);到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

​​

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

是否在您发布的每个代码中发生错误,或者它可能会被简化? – 2013-04-24 12:09:30

+0

和btw。 http://stackoverflow.com/questions/7274231/listfragment-onlistitemclick-not-being-called – 2013-04-24 12:11:51

+0

我修复了第二个问题。没有错误,我会尝试再次解释第一个问题。 我在“分类” - 表单上,单击列表中的一个项目使另一个列表被显示,最后被隐藏。但是,如果我再点击另一个选项卡,“Kategorier”-Tab中的列表就不会隐藏。它在彼此的顶部显示了两个片段。我看着这个:http://stackoverflow.com/questions/10502786/switching-fragments-within-tab并试图改变我的tablistener,因为这个人做,但没有成功。 – user2307292 2013-04-24 12:42:37

回答

0

你需要弄清楚你应该如何处理你的标签。您在您的TabListener中附加和分离,但在单击ListView时显示和隐藏。

您可以分离所有当前片段,然后附加新片段,或者将选项卡侦听器更改为.show()和.hide()。

编辑:根据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 2013-04-24 16:05:28

+0

提供您的logcat日志。 – jwong 2013-04-24 16:11:50

+0

他们几乎在页面的顶部。 – user2307292 2013-04-24 16:18:36