Android Ersetzen Fragment innerhalb eines Fragments

Ich habe ein Fragment namens "MeinProfilFragment" . Und eine MainActivity, die die ActionBar-Tabs-Logik behandelt.

Im "MeinProfilFragment" habe ich die Logik für einen "Login-Prozess" gesetzt .

Nachdem der Benutzer erfolgreich angemeldet ist, möchte ich ein anderes Layout anzeigen.

Wie macht man ? Es ist möglich, ein Fragment innerhalb eines Fragments zu ersetzen ? Oder muss ich die MainActivity für UI-Updates anrufen?

Hier ist der Code der "MainActivity" :

public class MainActivity extends Activity { public static int selectedTab; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ActionBar actionBar = getActionBar(); actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); actionBar.setDisplayShowHomeEnabled(false); actionBar.setDisplayShowTitleEnabled(false); actionBar.setDisplayShowCustomEnabled(false); Tab meinProfil = actionBar.newTab().setText("Mein Profil"); TabListener<MeinProfilFragment> tabListenerMeinProfil = new TabListener<MeinProfilFragment>(this,"Mein Profil",MeinProfilFragment.class); meinProfil.setTabListener(tabListenerMeinProfil); actionBar.addTab(meinProfil); Tab mitglieder = actionBar.newTab().setText("Mitglieder"); TabListener<MitgliederFragment> tabListenerMitglieder = new TabListener<MitgliederFragment>(this,"Mitglieder",MitgliederFragment.class); mitglieder.setTabListener(tabListenerMitglieder); actionBar.addTab(mitglieder); Tab dinner = actionBar.newTab().setText("Dinner"); TabListener<DinnerFragment> tabListenerDinner = new TabListener<DinnerFragment>(this,"Dinner",DinnerFragment.class); dinner.setTabListener(tabListenerDinner); actionBar.addTab(dinner); Tab community = actionBar.newTab().setText("Community"); TabListener<CommunityFragment> tabListenerCommunity = new TabListener<CommunityFragment>(this,"Community",CommunityFragment.class); community.setTabListener(tabListenerCommunity); actionBar.addTab(community); if(savedInstanceState != null){ actionBar.setSelectedNavigationItem(savedInstanceState.getInt("selectedTab")); } } private static class TabListener<T extends Fragment> implements ActionBar.TabListener { private Fragment mFragment; private final Activity mActivity; private final String mTag; private final Class<T> mClass; public TabListener(Activity activity,String tag,Class<T> clz) { mActivity = activity; mTag = tag; mClass = clz; } @Override public void onTabSelected(Tab tab, FragmentTransaction ft) { selectedTab = tab.getPosition(); Fragment prevFragment; FragmentManager fm = mActivity.getFragmentManager(); prevFragment = fm.findFragmentByTag(mTag); if (prevFragment != null) { mFragment = prevFragment; } if(mFragment == null){ mFragment = Fragment.instantiate(mActivity, mClass.getName()); ft.add(android.R.id.content, mFragment,mTag); }else{ ft.attach(mFragment); } } @Override public void onTabUnselected(Tab tab, FragmentTransaction ft) { selectedTab = tab.getPosition(); if(mFragment != null){ ft.detach(mFragment); }else{ mFragment = Fragment.instantiate(mActivity, mClass.getName()); ft.add(android.R.id.content, mFragment,mTag); } } @Override public void onTabReselected(Tab tab, FragmentTransaction ft) { selectedTab = tab.getPosition(); } } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putInt("selectedTab", selectedTab); } 

Und hier ist das MeinProfilFragment:

 public class MeinProfilFragment extends Fragment implements OnClickListener{ EditText LoginEmail; EditText LoginPassw; Button LoginButton; public boolean loggedIn = false; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) { View view = inflater.inflate(R.layout.mein_profil_fragment,container, false); LoginEmail = (EditText) view.findViewById(R.id.login_email_input); LoginPassw = (EditText) view.findViewById(R.id.login_passwort_input); LoginButton = (Button) view.findViewById(R.id.login_submit); LoginButton.setOnClickListener(this); return view; } @Override public void onClick(View arg0) { switch(arg0.getId()) { case R.id.login_submit: // Get Input Values: String login_email = LoginEmail.getText().toString(); String login_passw = LoginPassw.getText().toString(); if(login_email.length()<6 || login_passw.length()<4){ return; } Log.i("TEST","onClick: E-Mail: "+login_email+" \n Passwort: "+login_passw); new Login().execute(login_email,login_passw); break; } } private class Login extends AsyncTask<String,Void,JSONObject> { @Override protected JSONObject doInBackground(String... params) { HttpClient httpClient = new DefaultHttpClient(); HttpPost httpPost = new HttpPost("xxxx"); try{ List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2); nameValuePairs.add(new BasicNameValuePair("mitglied_email",params[0])); nameValuePairs.add(new BasicNameValuePair("mitglied_passwort",params[1])); httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); HttpResponse response = httpClient.execute(httpPost); HttpEntity entity = response.getEntity(); InputStream is = entity.getContent(); BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8); String line = reader.readLine(); JSONObject jsonData = new JSONObject(line); return jsonData; }catch(Exception e){ e.printStackTrace(); } return null; } @Override protected void onPostExecute(JSONObject result) { super.onPostExecute(result); updateUi(result); } } public void updateUi(JSONObject result) { try { Log.i("TEST",result.getString("logged_in")); String loggedInFlag = result.getString("logged_in"); if(loggedInFlag.equals("true")){ // Richtige Angaben: Log.i("TEST","loggedInFlag EQ TRUE"); loggedIn = true; // Here i want to replace this current fragment with another called eg "ProfileFragment" }else{ // Falsche Angaben: Log.i("TEST","loggedInFlag EQ FALSE"); loggedIn = false; } } catch (JSONException e) { e.printStackTrace(); } } 

In der updateUi () – Methode möchte ich eine andere Benutzeroberfläche anzeigen / aufblasen.

Wie macht man ? Gibt es eine Möglichkeit, das Fragment neu zu starten und dann ein weiteres Fragment-Layout im onCreateView () aufzublasen.

Oder es ist möglich, das Fragment-Layout mit einem anderen Fragment-Layout innerhalb des Fragments zu ersetzen?

Was ist die beste Praxis?

  • Unterstützung FragmentPagerAdapter bezieht sich auf alte Fragmente
  • Android: onActivityResult im Fragment nicht aufgerufen
  • Android-Fragmente: Wann verwenden Sie ausblenden / zeigen oder hinzufügen / entfernen / ersetzen?
  • Wie bekomme ich Daten von DialogFragment zu einem Fragment?
  • Android Fragment Übergang Ausfahrt Animation gespielt oben geben Animation
  • Verwenden der Symbolleiste im Fragment oder in der Aktivität
  • Wie Update ListView in ListFragment von FragmentActivity?
  • Richtige Möglichkeit, den Fragmenten erste Daten zu geben?
  • One Solution collect form web for “Android Ersetzen Fragment innerhalb eines Fragments”

    Sie können Fragment ersetzen, indem Sie dies verwenden

     FragmentManager fragmentManager2 = getFragmentManager(); FragmentTransaction fragmentTransaction2 = fragmentManager2.beginTransaction(); DetailFragment fragment2 = new DetailFragment(); fragmentTransaction2.addToBackStack("xyz"); fragmentTransaction2.hide(MeinProfilFragment.this); fragmentTransaction2.add(android.R.id.content, fragment2); fragmentTransaction2.commit(); 
    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.