Starting fragment from button in another fragment

13,865

Ok well that should be really simple. I'm assuming you have the tabs and tab fragments all working correctly. What you want to do is launch a new activity (not fragment) from each button. You would use a fragment if you wanted to display the list view alongside the tab fragment, but because you want a new screen, you use an activity.

So in your buttons onClick Listener you just need to create a new intent and start it. Heres some example code:

public class LeaderShipFragment extends Fragment {
Button mButton8;
Button mButton9;
Button mButton10;


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    ViewGroup root = (ViewGroup) inflater.inflate(R.layout.leadership_fragment, null);
    return root;
}


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

    //get the button view
    mButton8 = getView().findViewById(R.id.button8);
    //set a onclick listener for when the button gets clicked
    mButton8.setOnClickListener(new OnClickListener() {
        //Start new list activity
        @Override
        public void onClick(View v) {
            Intent mainIntent = new Intent(getActivity(), Button8ListActivity.class);
            startActivity(mainIntent);
        }
    });
    //get the button view
    mButton9 = getView().findViewById(R.id.button9);
    //set a onclick listener for when the button gets clicked
    mButton9.setOnClickListener(new OnClickListener() {
        //Start new list activity
        @Override
        public void onClick(View v) {
            Intent mainIntent = new Intent(getActivity(), Button9ListActivity.class);
            startActivity(mainIntent);
        }
    });
    //get the button view
    mButton10 = getView().findViewById(R.id.button10);
    //set a onclick listener for when the button gets clicked
    mButton10.setOnClickListener(new OnClickListener() {
        //Start new list activity
        @Override
        public void onClick(View v) {
            Intent mainIntent = new Intent(getActivity(), Button10ListActivity.class);
            startActivity(mainIntent);
        }
    });

}

}

Hopefully that does what you want. Android will handle all the backstack and activity lifecycle stuff, so its really quite simple.

Share:
13,865
Bryan
Author by

Bryan

I have a full time job installing electronics in cars. Anything from cd players to cruise controls to alarms and remote starts. I love tinkering with gadgets all the time. I got a job at best buy one time just to get the discount. Android is my main platform that I am developing on. 3:16 apps is the company I develop for. We design christian based apps for congregations. These are specific for each congregation so that the member can keep up to date with their local congregation. If you have any questions just ask me

Updated on June 05, 2022

Comments

  • Bryan
    Bryan almost 2 years

    Ok I have an app that implements tabs in the action bar using fragments. each of those tabs have their own views with buttons in them each. I want to be able to launch either an activity or another fragment view from those buttons to do various other things. An example of what i'm trying to do would be as follows. I have my main activity which looks like this:

     public class MainActivity extends SherlockFragmentActivity {
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    
        ActionBar bar = getSupportActionBar();
        bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
        bar.setDisplayOptions(0, ActionBar.DISPLAY_SHOW_TITLE);
        bar.setDisplayHomeAsUpEnabled(true);
        bar.setDisplayShowTitleEnabled(true);
        bar.setTitle("Newalla Church of Christ");
    
        bar.addTab(bar.newTab()
                .setText("Home")
                .setTabListener(new TabListener<HomeFragment>(
                        this, "Home", HomeFragment.class, null)));
    
        bar.addTab(bar.newTab()
                .setText("Feeds")
                .setTabListener(new TabListener<FeedsFragment>(
                        this, "Feeds", FeedsFragment.class, null)));
    
        bar.addTab(bar.newTab()
                .setText("Leadership")
                .setTabListener(new TabListener<LeadershipFragment>(
                        this, "Leadership", LeadershipFragment.class, null)));
    
        bar.addTab(bar.newTab()
                .setText("Bulletin")
                .setTabListener(new TabListener<BulletinFragment>(
                        this, "Bulletin", BulletinFragment.class, null)));
    
        bar.addTab(bar.newTab()
                .setText("Directory")
                .setTabListener(new TabListener<DirectoryFragment>(
                        this, "Directory", DirectoryFragment.class, null)));
    
    if (savedInstanceState != null) {
    
            bar.setSelectedNavigationItem(savedInstanceState.getInt("tab", 0));
        }
    
    
    }
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        case android.R.id.home:
            // app icon in action bar clicked; go home
                        Intent intent = new Intent(this, MainActivity.class);
                        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                        startActivity(intent);
                        return true;
        default:
            return super.onOptionsItemSelected(item);
        }
    }
    
    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putInt("tab", getSupportActionBar()
                .getSelectedNavigationIndex());
    }
    
    public class TabListener<T extends Fragment> implements
            ActionBar.TabListener {
        private final FragmentActivity mActivity;
        private final String mTag;
        private final Class<T> mClass;
        private final Bundle mArgs;
        private Fragment mFragment;
    
        public TabListener(FragmentActivity activity, String tag, Class<T> clz,
                Bundle args) {
            mActivity = activity;
            mTag = tag;
            mClass = clz;
            mArgs = args;
            FragmentTransaction ft = mActivity.getSupportFragmentManager()
                    .beginTransaction();
    
            // 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.getSupportFragmentManager()
                    .findFragmentByTag(mTag);
            if (mFragment != null && !mFragment.isDetached()) {
                ft.detach(mFragment);
            }
        }
    
    
        @Override
        public void onTabSelected(Tab tab, FragmentTransaction ft) {
            ft = mActivity.getSupportFragmentManager()
                    .beginTransaction();
    
            if (mFragment == null) {
                mFragment = Fragment.instantiate(mActivity, mClass.getName(),
                        mArgs);
                ft.add(android.R.id.content, mFragment, mTag);
                ft.commit();
            } else {
                ft.attach(mFragment);
                ft.commit();
            }
    
        }
    
        @Override
        public void onTabUnselected(Tab tab, FragmentTransaction ft) {
            ft = mActivity.getSupportFragmentManager()
                    .beginTransaction();
    
            if (mFragment != null) {
                ft.detach(mFragment);
                ft.commitAllowingStateLoss();
            }
    
        }
    
        @Override
        public void onTabReselected(Tab tab, FragmentTransaction ft) {
        }
    }
     }
    

    One of the tabs is leadership. In this tab i need to load three different list views from the buttons. Here is an example of the list view and viewers that i have made.

    List Activity

     public class EldersListActivity extends SherlockFragmentActivity implements EldersListFragment.ListItemSelectedListener {
    
     /** Called when the activity is first created. */
     @Override
     public void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     setContentView(R.layout.listview);
     }
    
     @Override
     public void onListItemSelected(int index) {
    EldersListFragment imageViewer = (EldersListFragment) getSupportFragmentManager()
        .findFragmentById(R.id.viewer_fragment);
    
     if (imageViewer == null || !imageViewer.isInLayout()) {
    Intent showImage = new Intent(getApplicationContext(),
            ViewerActivity.class);
    showImage.putExtra("index", index);
    startActivity(showImage);
     } 
    }
    
     }
    

    List Fragment

     public class EldersListFragment extends SherlockListFragment{
    private int index = 0;
    private ListItemSelectedListener selectedListener;
    
    @Override
    public void onListItemClick(ListView l, View v, int position, long id) {
        index = position;
        selectedListener.onListItemSelected(position);
    }
    
    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        setListAdapter(ArrayAdapter.createFromResource(getActivity(),
                R.array.elders, android.R.layout.simple_list_item_1));
    
        if (savedInstanceState != null) {
            index = savedInstanceState.getInt("index", 0);
            selectedListener.onListItemSelected(index);
        }
    }
    
    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putInt("index", index);
    }
    
    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        try {
            selectedListener = (ListItemSelectedListener) activity;
        } catch (ClassCastException e) {
            throw new ClassCastException(activity.toString()
                    + " must implement ListItemSelectedListener in Activity");
        }
    }
    
    public interface ListItemSelectedListener {
        public void onListItemSelected(int index);
    }
     }
    

    Viewer Activity

     public class ViewerActivity extends SherlockFragmentActivity {
     public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
            if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
                finish();
                return;
            }
    
            setContentView(R.layout.viewer_activity);
            Intent launchingIntent = getIntent();
            int index = launchingIntent.getIntExtra("index", 0);
            ViewerFragment viewer = (ViewerFragment) getSupportFragmentManager()
                    .findFragmentById(R.id.viewer_fragment);
            viewer.update(index);
        }
    }
    

    Viewer Fragment

     public class ViewerFragment extends SherlockFragment {
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        return inflater.inflate(R.layout.viewer_fragment, container, false);
    }
    
    public void update(int index) {
        TextView title = (TextView) getView().findViewById(R.id.title);
        ImageView image = (ImageView) getView().findViewById(R.id.image);
    
        String[] imageTitles = getResources().getStringArray(R.array.elders);
        String[] imageLocations = getResources().getStringArray(R.array.elder_images);
    
        title.setText(imageTitles[index]);
        InputStream is;
        try {
            is = getActivity().getAssets().open(imageLocations[index]);
            Bitmap bitmap = BitmapFactory.decodeStream(is);
            image.setImageBitmap(bitmap);
        } catch (IOException e) {
            Log.e("ViewerFragment", "Failed to decode image");
        }
    }
     }
    

    and Finally The leadership tab that in the view has three buttons. Each button needs to call a different list view. Here is the code and xml file for those.

    Leadership Fragment

     import android.content.Intent;
     import android.os.Bundle;
     import android.view.LayoutInflater;
     import android.view.View;
     import android.view.View.OnClickListener;
     import android.view.ViewGroup;
     import android.widget.Button;
    
     import com.actionbarsherlock.app.SherlockFragment;
    
     public class LeadershipFragment extends SherlockFragment {
    
    Button mButton8;
    Button mButton9;
    Button mButton10;
    
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
    
            Bundle savedInstanceState) {
    
        View view = inflater.inflate(R.layout.tab_leadership_layout, container, false);
        return view;
    
    }
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
            //get the button view
            mButton8 = (Button) getView().findViewById(R.id.button8);
            //set a onclick listener for when the button gets clicked
            mButton8.setOnClickListener(new OnClickListener() {
                //Start new list activity
                @Override
                public void onClick(View v) {
                    Intent mainIntent = new Intent(getActivity(), EldersListActivity.class);
                    startActivity(mainIntent);
                }
            });
    
        }
    
    }
    

    Leadership XML FILE

     <?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">
    
    
    <RelativeLayout 
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="@drawable/background" >
    
    <ImageView
        android:id="@+id/imageView3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="31dp"
        android:src="@drawable/lead" 
        android:contentDescription="@string/lead"/>
    
    
    
    <Button
        android:id="@+id/button8"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:background="@drawable/ministers" />
    
    
    <Button
        android:id="@+id/button10"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:layout_marginLeft="30dp"
        android:layout_toRightOf="@+id/button8"
        android:background="@drawable/deacons" />
    
    <Button
        android:id="@+id/button9"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:layout_marginRight="30dp"
        android:layout_toLeftOf="@+id/button8"
        android:background="@drawable/elders" />
    
     </RelativeLayout>
     </LinearLayout> 
    

    LOG CAT FOR FORCE CLOSE

     10-18 23:39:34.196: E/AndroidRuntime(9601): FATAL EXCEPTION: main
     10-18 23:39:34.196: E/AndroidRuntime(9601): java.lang.NullPointerException
     10-18 23:39:34.196: E/AndroidRuntime(9601):    at com.threesixteenapps.newalla.LeadershipFragment.onCreate(LeadershipFragment.java:31)
     10-18 23:39:34.196: E/AndroidRuntime(9601):    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:835)
     10-18 23:39:34.196: E/AndroidRuntime(9601):    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1083)
     10-18 23:39:34.196: E/AndroidRuntime(9601):    at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:635)
     10-18 23:39:34.196: E/AndroidRuntime(9601):    at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1431)
     10-18 23:39:34.196: E/AndroidRuntime(9601):    at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:420)
     10-18 23:39:34.196: E/AndroidRuntime(9601):    at android.os.Handler.handleCallback(Handler.java:587)
     10-18 23:39:34.196: E/AndroidRuntime(9601):    at android.os.Handler.dispatchMessage(Handler.java:92)
     10-18 23:39:34.196: E/AndroidRuntime(9601):    at android.os.Looper.loop(Looper.java:150)
     10-18 23:39:34.196: E/AndroidRuntime(9601):    at android.app.ActivityThread.main(ActivityThread.java:4263)
     10-18 23:39:34.196: E/AndroidRuntime(9601):    at java.lang.reflect.Method.invokeNative(Native Method)
     10-18 23:39:34.196: E/AndroidRuntime(9601):    at java.lang.reflect.Method.invoke(Method.java:507)
     10-18 23:39:34.196: E/AndroidRuntime(9601):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
     10-18 23:39:34.196: E/AndroidRuntime(9601):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
     10-18 23:39:34.196: E/AndroidRuntime(9601):    at dalvik.system.NativeStart.main(Native Method)
    
  • Bryan
    Bryan over 11 years
    I edited my original post to add the code that you provided here, I have no errors in it now but when i click the leadership tab now it force closes the app and it would pull up the view before, any ideas on why
  • Bryan
    Bryan over 11 years
    I think the code would probally work fine but it doesn't define the layout needed, I tried to use the setContentView method after the on create but that threw errors as well. I think i need some sort of layout inflator for it but not sure how to define it
  • athor
    athor over 11 years
    I've edited my answer with the onCreateView method in the fragment. Try it out and post any more issues you have (with a stack trace of the error).
  • Bryan
    Bryan over 11 years
    have code exactly as you have it minus the button 9 and 10 cause i don't have those set up yet however they will be just like button 8
  • athor
    athor over 11 years
    The issue is at line 31 in your fragment. Is that the findviewbyid line or the setonclicklistener?
  • Bryan
    Bryan over 11 years
    line 31 is mButton8 = (Button) getView().findViewById(R.id.button8);
  • athor
    athor over 11 years
    Ok sorry, its my mistake. For fragments you need to use onCreateView for binding views etc instead of onCreate. So change you onCreate method in the fragment to @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState);
  • Bryan
    Bryan over 11 years
    YOU ARE AWESOME Thank you worked like a champ, now on to coding the rest of the app, accepted answer and upvoted it THANK YOU AGAIN