Cum adaug un Fragment de la o Activitate cu o programatic conținutul creat de vedere

Vreau să adaug un Fragment de la o Activitate care implementează aspectul său programatic. M-am uitat peste Fragmentul de documentare, dar nu sunt't de multe exemple care descriu ceea ce am nevoie. Aici este tipul de cod am incercat sa scriu:

public class DebugExampleTwo extends Activity {

    private ExampleTwoFragment mFragment;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        FrameLayout frame = new FrameLayout(this);
        if (savedInstanceState == null) {
            mFragment = new ExampleTwoFragment();
            FragmentTransaction ft = getFragmentManager().beginTransaction();
            ft.add(frame.getId(), mFragment).commit();
        }

        setContentView(frame);
    }
}

...

public class ExampleTwoFragment extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, 
                             ViewGroup container, 
                             Bundle savedInstanceState) {
        Button button = new Button(getActivity());
        button.setText("Hello There");
        return button;
    }
}

Acest cod compilează, dar se blochează la pornire, probabil din cauza mea FragmentTransaction.adaugă() este incorect. Ce este modul corect de a face acest lucru?

Soluția

Se pare ca nu's mai mult de o problema cu acel cod. Un fragment nu poate fi declarat acest fel, în interiorul aceluiași fișier java ca activitate, dar nu ca un public clasă internă. Cadrul se așteaptă ca fragment's constructor (fără parametri) de a fi public și vizibil. Se deplasează fragmentul în Activitate ca o clasă internă, sau crearea unui nou fișier java pentru fragmentul stabilește că.

A doua problemă este că, atunci când te're adăugarea unui fragment de acest fel, trebuie să treacă o trimitere la fragmentul's conțin vedere, și acest punct de vedere trebuie să aibă un id personalizat. Folosind implicit id-ul se va prăbuși app. Aici's a actualizat de cod:

public class DebugExampleTwo extends Activity {

    private static final int CONTENT_VIEW_ID = 10101010;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        FrameLayout frame = new FrameLayout(this);
        frame.setId(CONTENT_VIEW_ID);
        setContentView(frame, new LayoutParams(
            LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));

        if (savedInstanceState == null) {
            Fragment newFragment = new DebugExampleTwoFragment();
            FragmentTransaction ft = getFragmentManager().beginTransaction();
            ft.add(CONTENT_VIEW_ID, newFragment).commit();
        }
    }

    public static class DebugExampleTwoFragment extends Fragment {
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
            EditText v = new EditText(getActivity());
            v.setText("Hello Fragment!");
            return v;
        }
    }
}
Comentarii (13)

Aici este ceea ce mi-a venit după ce a citit Tony Wong's comentariu:

public class DebugExampleTwo extends BaseActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addFragment(android.R.id.content,
                    new DebugExampleTwoFragment(),
                    DebugExampleTwoFragment.FRAGMENT_TAG);
    }

}

...

public abstract class BaseActivity extends Activity {

    protected void addFragment(@IdRes int containerViewId,
                               @NonNull Fragment fragment,
                               @NonNull String fragmentTag) {
        getSupportFragmentManager()
                .beginTransaction()
                .add(containerViewId, fragment, fragmentTag)
                .disallowAddToBackStack()
                .commit();
    }

    protected void replaceFragment(@IdRes int containerViewId,
                                   @NonNull Fragment fragment,
                                   @NonNull String fragmentTag,
                                   @Nullable String backStackStateName) {
        getSupportFragmentManager()
                .beginTransaction()
                .replace(containerViewId, fragment, fragmentTag)
                .addToBackStack(backStackStateName)
                .commit();
    }

}

...

public class DebugExampleTwoFragment extends Fragment {

    public static final String FRAGMENT_TAG = 
        BuildConfig.APPLICATION_ID + ".DEBUG_EXAMPLE_TWO_FRAGMENT_TAG";

    // ...

}

Kotlin

Dacă utilizați Kotlin asigurați-vă că pentru a lua o privire la ceea ce Kotlin extensiile de către Google a oferi sau scrie opinia ta.

Comentarii (1)
    public class Example1 extends FragmentActivity {

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
          DemoFragment fragmentDemo = (DemoFragment) 
          getSupportFragmentManager().findFragmentById(R.id.frame_container);
          //above part is to determine which fragment is in your frame_container
          setFragment(fragmentDemo);
                       (OR)
          setFragment(new TestFragment1());
        }

        // This could be moved into an abstract BaseActivity 
        // class for being re-used by several instances
        protected void setFragment(Fragment fragment) {
            FragmentManager fragmentManager = getSupportFragmentManager();
            FragmentTransaction fragmentTransaction = 
                fragmentManager.beginTransaction();
            fragmentTransaction.replace(android.R.id.content, fragment);
            fragmentTransaction.commit();
        }
    }

Pentru a adăuga un fragment într-o Activitate sau FramentActivity este nevoie de o Recipient. Container ar trebui să fie un "Framelayout", care poate fi incluse în xml sau altceva vă puteți folosi implicit recipient pentru că ca " android.R.id.conținut" pentru a elimina sau înlocui un fragment în Activitate.

main.xml






Comentarii (1)

După ce a citit toate Raspunsurile am venit cu mod elegant:

public class MyActivity extends ActionBarActivity {

 Fragment fragment ;

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

    FragmentManager fm = getSupportFragmentManager();
    fragment = fm.findFragmentByTag("myFragmentTag");
    if (fragment == null) {
        FragmentTransaction ft = fm.beginTransaction();
        fragment =new MyFragment();
        ft.add(android.R.id.content,fragment,"myFragmentTag");
        ft.commit();
    }

}

practic tu nu't nevoie pentru a adăuga un frameLayout ca recipient de fragment în schimb, puteți adăuga direct fragmentul în root android recipient de Vedere

IMPORTANT: don't folosi înlocui fragment ca de cele mai multe abordări prezentate aici, dacă nu't mintea să-și piardă fragment variabilă exemplu de stat în timpul onrecreation proces.

Comentarii (0)
public abstract class SingleFragmentActivity extends Activity {

    public static final String FRAGMENT_TAG = "single";
    private Fragment fragment;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
        if (savedInstanceState == null) {
            fragment = onCreateFragment();
           getFragmentManager().beginTransaction()
                   .add(android.R.id.content, fragment, FRAGMENT_TAG)
                   .commit();
       } else {
           fragment = getFragmentManager().findFragmentByTag(FRAGMENT_TAG);
       }
   }

   public abstract Fragment onCreateFragment();

   public Fragment getFragment() {
       return fragment;
   }

}

utilizarea

public class ViewCatalogItemActivity extends SingleFragmentActivity {
    @Override
    public Fragment onCreateFragment() {
        return new FragmentWorkShops();
    }

}
Comentarii (0)

Pentru API de nivel 17 sau mai mare, View.generateViewId() va rezolva această problemă. Utilitarul metodă oferă un id unic, care nu este utilizat în timp construi.

Comentarii (1)