bibi_bryan
bibi_bryan

Reputation: 371

Replacing Fragment with fragment in activity

I have an Activity that has a Fragment (Frag A) added to it in its onCreate method. This Fragment contains the UI elements i would like the activity to display on default. On button click in frag A, i would like to replace Frag A with another fragment(Frag B) that shows a progress bar. If there is a configuration while Frag B is showing, Frag(A) should not be added when the activity's onCreate method is called.

How can i achieve this?

Just like its done in this facebook app:

First Screen showing UI Second sreeen showing progress bar after button click in

I've tried a lot of methods:

  1. First i added the UI elements directly in the activity's layout along with an empty framelayout, so on button click i hide the UI elements and do a Fragment transaction to put my fragment containing my progress bar in the framelayout, this works fine but if there is configuration change the activity is recreated and i am back to square one.

This is what i have now.

MainActivity

    public class MainActivity extends FragmentActivity  {
Button button;
private ProgressDialog mpDialog;
boolean running;

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

    MainFragment fragment = new MainFragment();
        FragmentTransaction fragmentTransaction=    getSupportFragmentManager().beginTransaction();
        fragmentTransaction.add(R.id.wrapper, fragment).commit();

}



public void Click() {
    TaskFragment taskFragment = new TaskFragment();
    getSupportFragmentManager().beginTransaction().replace(R.id.wrapper, taskFragment).commit();

}


 }

MainFragment(Holding UI elements)

    public class MainFragment extends Fragment {

View fView;
ProgressBar bar;
TextView textView;
Button button;
MainActivity activity = new MainActivity();
@Override
public void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setRetainInstance(true);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    fView = inflater.inflate(R.layout.mainfragment, container, false);
    textView = (TextView) fView.findViewById(R.id.textview);
    button = (Button) fView.findViewById(R.id.button);
    clicked();
    return fView;
}


private void clicked() {
    // TODO Auto-generated method stub
    button.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View arg0) {
            // TODO Auto-generated method stub

            activity.Click();
        }
    });

}

   }

TaskFragment(Showing progress bar)

   public class TaskFragment extends Fragment{

View fview;
ProgressBar bar;

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

}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    // TODO Auto-generated method stub

    fview = inflater.inflate(R.layout.progressfragment, container, false);
    bar = (ProgressBar) fview.findViewById(R.id.sendingSmsProgress);
    return fview;
}

 }

The Error i get when i try to switch fragments

  03-14 05:41:44.457: E/AndroidRuntime(11049): FATAL EXCEPTION: main
  03-14 05:41:44.457: E/AndroidRuntime(11049): java.lang.IllegalStateException: Activity has been destroyed
  03-14 05:41:44.457: E/AndroidRuntime(11049):  at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1365)
  03-14 05:41:44.457: E/AndroidRuntime(11049):  at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:595)
  03-14 05:41:44.457: E/AndroidRuntime(11049):  at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:574)
  03-14 05:41:44.457: E/AndroidRuntime(11049):  at com.example.test.MainActivity.Click(MainActivity.java:41)
  03-14 05:41:44.457: E/AndroidRuntime(11049):  at com.example.test.MainFragment$1.onClick(MainFragment.java:47)
  03-14 05:41:44.457: E/AndroidRuntime(11049):  at android.view.View.performClick(View.java:4102)
  03-14 05:41:44.457: E/AndroidRuntime(11049):  at android.view.View$PerformClick.run(View.java:17085)
  03-14 05:41:44.457: E/AndroidRuntime(11049):  at android.os.Handler.handleCallback(Handler.java:615)
  03-14 05:41:44.457: E/AndroidRuntime(11049):  at android.os.Handler.dispatchMessage(Handler.java:92)
  03-14 05:41:44.457: E/AndroidRuntime(11049):  at android.os.Looper.loop(Looper.java:155)
  03-14 05:41:44.457: E/AndroidRuntime(11049):  at android.app.ActivityThread.main(ActivityThread.java:5454)
  03-14 05:41:44.457: E/AndroidRuntime(11049):  at java.lang.reflect.Method.invokeNative(Native Method)
  03-14 05:41:44.457: E/AndroidRuntime(11049):  at java.lang.reflect.Method.invoke(Method.java:511)
  03-14 05:41:44.457: E/AndroidRuntime(11049):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1029)
  03-14 05:41:44.457: E/AndroidRuntime(11049):  at  com.android.internal.os.ZygoteInit.main(ZygoteInit.java:796)
  03-14 05:41:44.457: E/AndroidRuntime(11049):  at dalvik.system.NativeStart.main(Native Method)

Upvotes: 0

Views: 954

Answers (1)

Tamilselvan Kalimuthu
Tamilselvan Kalimuthu

Reputation: 1532

If you want to replace the fragment from the fragment use like this

getActivity().getSupportFragmentManager().beginTransaction()
            .replace(R.id.frame, new DialogFragment()).commit();

Upvotes: 1

Related Questions