I have tabs, in one tab there is a ListFragment
with an onListItemClick
. When you click one item another ListFragment
is displayed so this works fine. The same onListItemClick
as the one for the first ListFragment
is implemented to the second ListFragment
.
EDIT: this is how i tried to change the 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);
}
}
}
Now the app crashes if I click on an item in the first list. LogCat says:
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)
I have two problems:
When I have clicked one item in the first
ListFragment
being displayed and then click another tab, the list doesn't hide.(Solved) When I have clicked one item in the first
ListFragment
being displayed and then click on the otherListFragment
the app crashes.
What I would like to have when second ListFragment
is clicked is a fragment with simple text in it, not a list.
Am I doing this the wrong way? Anyone who knows?
Problem 2 solved by:
comment the setContentView in main
change all the ListFragment current = (ListFragment) fm.findFragmentByTag(getTag()); and ft.add(R.id.Frame, mFragment); to Listfragment current = (ListFragment) fm.findFragmentById(android.R.id.content); and ft.add(android.R.id.content, mFragment);
and finally changing to this in 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;
}
}
My code:
Main
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>