2016-11-10 2 views
0

hinzufügen Ich versuche zu ermöglichen, Fragmente zum Container (FrameLayout) der Aktivität hinzufügen, indem Sie einige Methoden der Aktivität aufrufen.Wie Fragment zu Aktivität aus einer anderen Klasse in Android

So, hier ist eine vereinfachte Version meiner Tätigkeit Klasse:

public class TermsAndConditionsActivity extends AppCompatActivity { 

private static TermsAndConditionsActivity   instance; 
private static boolean        loggedIn; 
private TermsAndConditionsListener     termsAndConditionsListener; 

private TermsAndConditionsFragment     termsAndConditionsFragment; 
private ReadTermsAndConditionsFragment    readTermsAndConditionsFragment; 
private Terms          terms; 
private User          user; 
protected FragmentManager       fragmentManager; 

public TermsAndConditionsActivity() {} 

public static TermsAndConditionsActivity getInstance(Terms terms, User user, boolean loggedIn, TermsAndConditionsListener termsAndConditionsListener) { 
    if (instance == null) { 
     instance       = new TermsAndConditionsActivity(); 
     instance.terms      = terms; 
     instance.user      = user; 
     instance.loggedIn     = loggedIn; 
     instance.termsAndConditionsListener = termsAndConditionsListener; 
    } 
    return instance; 
} 

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    super.setContentView(R.layout.activity_main_activity_no_drawer); 
    fragmentManager = getSupportFragmentManager(); 
    prepareReadTermsAndConditionsFragment(); 
    prepareTermsAndConditionsFragment(); 
} 

private void prepareTermsAndConditionsFragment() { 
    if (termsAndConditionsFragment == null) { 
     if (loggedIn) { 
      termsAndConditionsFragment = TermsAndConditionsOnlineFragment.newInstance(termsAndConditionsListener); 
     } else { 
      termsAndConditionsFragment = TermsAndConditionsAnonymousFragment.newInstance(termsAndConditionsListener); 
     } 
    } 
} 
private void prepareReadTermsAndConditionsFragment() { 
    if (readTermsAndConditionsFragment == null) { 
     readTermsAndConditionsFragment = ReadTermsAndConditionsFragment.newInstance(terms, user, termsAndConditionsListener); 
    } 
} 

public void openTermsAndConditions() { 
    initFragment(termsAndConditionsFragment); 
} 

public void openReadTermsAndConditions() { 
    initFragment(readTermsAndConditionsFragment); 
} 

private void initFragment(TermsAndConditionsFragment fragment) { 
    if (fragment != null) { 
     FragmentTransaction ft = getFragmentTransaction(); 
     ft.add(getContainerId(), fragment, fragment.getTagString()).commit(); 
    } 
} 

protected FragmentTransaction getFragmentTransaction() { 
    FragmentTransaction ft = fragmentManager.beginTransaction(); 
    ft.setCustomAnimations(R.anim.fade_in, R.anim.fade_out); 
    return ft; 
} 

public static void startActivity(Context context, int flags) { 
    if (context != null) { 
     Intent launchIntent     = getIntent(context, flags); 
     context.startActivity(launchIntent); 
    } 
} 

public static Intent getIntent(Context context, int flags) { 
    Intent launchIntent = new Intent(context, TermsAndConditionsActivity.class); 
    launchIntent.addFlags(flags); 
    return launchIntent; 
} 
} 

die Aktivität Klasse funktioniert das Layout der Aktivität für die Erstellung, die zur Aufnahme Fragments im Grunde ein Framelayout ist.

Das Problem ist, dass, wenn ich die Methode "openTermsAndConditions()" von außerhalb der Aktivitätsklasse aufrufen, passiert nichts. Aber wenn ich es in der Aktivitätsklasse von onCreate aus anrufe, wird es korrekt hinzugefügt. Ich möchte diese von außerhalb der Aktivitätsklasse hinzufügen können.

Ich hoffe, dass mir jemand hier helfen kann.

Jede Hilfe wird sehr geschätzt.

Antwort

0

Erstellen Sie keine globalen Instanzen, die zu Speicherverschwendung führen, erstellen Sie sie nur im erforderlichen Methodenbereich, und in Ihrem Fall benötigen Sie die Fragmentinstanzen global nicht, da Sie sie nur einmal verwenden.

Versuchen Sie, diese

public void addYourFragment() 
{ 
    Fragment fragment = getSupportFragmentManager.findFragmentByTag(TermsAndConditionsFragment.class.getSimpleName()); 
    if(fragment == null) 
    { 
    fragment = new TermsAndConditionsFragment(); 
    } 
    if(fragment not added) 
    { 
    //call you initFragment,remove the first line in that and pass the Fragment parameter 
    initFragment(Fragment fragment) 
    { 
     //do add or replace and make this common method for all your fragments to be added don't use too many methods for each diff fragments to be added 
     } 
} 
Verwandte Themen