2016-05-13 13 views
6

In meiner App Meine erste Fragment ist in BackStack und das Fragment wurde nicht zum Backstack zum Zeitpunkt der Transaktionen hinzugefügt.Fragment ist im Backstack

Bearbeiten.

ich viele Male nach dem ersten Trennung gleiches Fragment verwende aber durch ersten gefolgt transection mit addToBackStack(TAG); zu Backstack hinzugefügt, aber ich hinzugefügt nie erstes Fragment zu Backstack, aber immer noch nicht verstehe ich, warum ich muß Klicken Sie zweimal, um die App an den Hintergrund zu senden.

Hier ist der Code davon

FragmentManager fm = getSupportFragmentManager(); 
Bundle args = new Bundle(); 
args.putString("url", Constants.URL_BASE); 
feedFragment.setArguments(args); 
fm.beginTransaction().replace(R.id.content_frame, feedFragment).commit(); 

Jetzt, als ich Taste wieder entfernt sie das Fragment aber App geht nicht in den Hintergrund. Es geht in den Hintergrund, wenn ich die Taste zum zweiten Mal drücke.

Ergibt replace() selbst das Fragment zum Backstack? Wenn ja, wie kann ich das Fragment entfernen und meine App in den Hintergrund gehen onBackPressed? Wenn das Fragment nicht zu Backstack hinzugefügt wird, warum passiert das? Wie soll ich es richtig machen?

Vielen Dank!

Bearbeiten:

Hier voller Aktivitätscode.

public class MainActivity extends AppCompatActivity { 
    private final String TAG = getClass().getName(); 
    private DrawerLayout drawerLayout; 
    private FeedFragment feedFragment = new FeedFragment(); 
    private ListView listView; 
    private LinearLayout searchLayout; 
    private RelativeLayout logolayout; 
    private Toolbar toolbar; 
    private Button settingBtn; 
    private Button bookmarkBtn; 
    private Button searchBtn; 
    private Tracker mTracker; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     ApplicationController applicationController = (ApplicationController) getApplication(); 
     mTracker = applicationController.getDefault(); 
     initToolbar(); 
     initUi(); 
     loadCategorgies(); 
     initFeed(); 
    } 

    public void initUi() { 
     drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); 
     listView = (ListView) findViewById(R.id.lv_categories); 
     settingBtn = (Button) findViewById(R.id.btn_settings); 
     bookmarkBtn = (Button) findViewById(R.id.btn_bookmarks); 
     searchBtn = (Button) findViewById(R.id.btn_search); 


     settingBtn.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       FragmentManager fragmentManager = getSupportFragmentManager(); 
       fragmentManager.beginTransaction().replace(R.id.content_frame, new SettingFragment()).addToBackStack("setting").commit(); 
       drawerLayout.closeDrawers(); 
      } 
     }); 

     bookmarkBtn.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       FragmentManager fragmentManager = getSupportFragmentManager(); 
       fragmentManager.beginTransaction().replace(R.id.content_frame, new BookmarkFragment()).addToBackStack("bookmark").commit(); 
       drawerLayout.closeDrawers(); 
      } 
     }); 

     searchBtn.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       FragmentManager fragmentManager = getSupportFragmentManager(); 
       fragmentManager.beginTransaction().replace(R.id.content_frame, new SearchFragment()).addToBackStack("search").commit(); 
       drawerLayout.closeDrawers(); 
      } 
     }); 
    } 

    public void initToolbar() { 
     toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 
     getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_action_menu_inactive); 
     getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
    } 

    public void hideLogo() { 
     ImageView imageView = (ImageView) toolbar.findViewById(R.id.logo); 
     imageView.setVisibility(View.GONE); 
    } 

    public void showLogo() { 
     ImageView imageView = (ImageView) toolbar.findViewById(R.id.logo); 
     imageView.setVisibility(View.VISIBLE); 
    } 

    public void loadCategorgies() { 
     StringRequest stringRequest = new StringRequest(Constants.URL_GET_CATEGORIES, new Response.Listener<String>() { 
      @Override 
      public void onResponse(String response) { 
       if (Constants.isDev) 
        Log.d(TAG, response); 
       final CategoriesDTO categoriesDTO = Constants.gson.fromJson(response, CategoriesDTO.class); 
       CatgoriesAdapter catgoriesAdapter = new CatgoriesAdapter(categoriesDTO, MainActivity.this); 
       listView.setAdapter(catgoriesAdapter); 
       listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
        @Override 
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
         if (Constants.isDev) 
          Log.d(TAG, "clicked" + categoriesDTO.getCategories().get(position).getTitle()); 
         FeedFragment feedFragment = new FeedFragment(); 
         FragmentManager fm = getSupportFragmentManager(); 
         Bundle args = new Bundle(); 
         args.putString("url", Constants.URL_BASE_CATEGORY + categoriesDTO.getCategories().get(position).getSlug()); 
         feedFragment.setArguments(args); 
         fm.beginTransaction().replace(R.id.content_frame, feedFragment).addToBackStack(categoriesDTO.getCategories().get(position).getSlug()).commit(); 
         drawerLayout.closeDrawers(); 
        } 
       }); 
      } 
     }, new Response.ErrorListener() { 
      @Override 
      public void onErrorResponse(VolleyError error) { 

      } 
     }); 
     ApplicationController.getmInstance().addToRequestQueue(stringRequest); 
    } 

    public void initFeed() { 
     FragmentManager fm = getSupportFragmentManager(); 
     Bundle args = new Bundle(); 
     args.putString("url", Constants.URL_BASE); 
     feedFragment.setArguments(args); 
     fm.beginTransaction().replace(R.id.content_frame, feedFragment).commit(); 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     int id = item.getItemId(); 
     switch (id) { 
      case android.R.id.home: 
       drawerLayout.openDrawer(GravityCompat.START); 
       return true; 
     } 
     return super.onOptionsItemSelected(item); 

    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 
     if (Constants.isDev) 
      Log.i(TAG, "Setting screen name: " + TAG); 
     mTracker.setScreenName("Image~" + TAG); 
     mTracker.send(new HitBuilders.ScreenViewBuilder().build()); 
    } 

    @Override 
    public void onBackPressed() { 
     super.onBackPressed(); 
     //moveTaskToBack(true); 
    } 
} 

bearbeiten

MCVE

Dies ist HomeActivity.

public class HomeActivity extends AppCompatActivity { 
    private final String TAG = getClass().getName(); 
    private DrawerLayout drawerLayout; 
    private FragmentManager fragmentManager; 
    private FeedFragment feedFragment = new FeedFragment(); 
    private Toolbar toolbar; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.home_activity); 
     fragmentManager = getSupportFragmentManager(); 
     initToolbar(); 
     initFeed(); 
    } 
    public void initToolbar() { 
     toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 
     getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_action_menu_inactive); 
     getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
    } 
public void initUi() { 
     drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); 
} 
    public void initFeed() { 

     Bundle args = new Bundle(); 
     args.putString("url", Constants.URL_BASE); 
     feedFragment.setArguments(args); 
     fragmentManager.beginTransaction().replace(R.id.content_frame, feedFragment).commit(); 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     int id = item.getItemId(); 
     switch (id) { 
      case android.R.id.home: 
       drawerLayout.openDrawer(GravityCompat.START); 
       return true; 
     } 
     return super.onOptionsItemSelected(item); 

    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 
     if (Constants.isDev) 
      Log.i(TAG, "Setting screen name: " + TAG); 
     mTracker.setScreenName("Image~" + TAG); 
     mTracker.send(new HitBuilders.ScreenViewBuilder().build()); 
    } 

    @Override 
    public void onBackPressed() { 
     super.onBackPressed(); 
    } 
} 

Dies ist das Fragment.

public class FeedFragment extends Fragment { 
private final String TAG = getClass().getName(); 
private View view; 

@Nullable 
@Override 
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
    view = inflater.inflate(R.layout.feed_fragment, container, false); 
    return view; 
} 
+0

Bitte erklären Sie, was das tun wird? –

+0

Können Sie uns mehr von Ihrem Code geben? Was tun Sie onBackPressed() -Methode und haben Sie andere Fragmente, die im Backstack sind, die die gleiche Containeransicht teilen? – Seishin

+0

@ Seishin ja ich habe andere Fragmente für den gleichen Container. Aber in diesem Moment wurde nur dieses Fragment durchtrennt und es wurde nicht zum Backstack hinzugefügt, wie im obigen Code zu sehen ist. –

Antwort

-1

In Ihrem onBackPressed, fügen Sie diese vor dem super.onBackPressed():

moveTaskToBack(true); 

EDIT

Ihre gewünschte Funktionalität zu erreichen, versuchen Sie dies:

@Override 
public void onBackPressed() { 

    int count = getFragmentManager().getBackStackEntryCount(); 
    //pop all fragments till it remains the first fragment then move to background 
    if (count == 1) { 
     super.onBackPressed(); 
     //additional code 
    } else { 
     getFragmentManager().popBackStack(); 
    } 

} 
+1

Ihre Lösung hat den gesamten App-Fluss durcheinander gebracht –

+0

Entschuldigung dafür. Können Sie erklären, was passiert ist, als Sie meine Lösung angewendet haben? – NezSpencer

+0

Dies nimmt die Anwendung in den Hintergrund, auch wenn es nicht im Hintergrund laufen sollte. Für das Fragment, das im Backstack ist. –

0

Dieser Code ist in Ordnung hier ist kein Problem, wenn Sie sta rt activity Sie legen es nicht auf Backstack.

FragmentManager fm = getSupportFragmentManager(); 
Bundle args = new Bundle(); 
args.putString("url", Constants.URL_BASE); 
feedFragment.setArguments(args); 
fm.beginTransaction().replace(R.id.content_frame, feedFragment).commit(); 

Aber nach initUI() Sie loadcategories() -Methode aufrufen, in dem Sie die Feed-Fragment in Backstack setzen. Aus diesem Grund müssen Sie zweimal klicken.

FeedFragment feedFragment = new FeedFragment(); 
        FragmentManager fm = getSupportFragmentManager(); 
        Bundle args = new Bundle(); 
        args.putString("url", Constants.URL_BASE_CATEGORY + categoriesDTO.getCategories().get(position).getSlug()); 
        feedFragment.setArguments(args); 
        fm.beginTransaction().replace(R.id.content_frame, feedFragment).addToBackStack(categoriesDTO.getCategories().get(position).getSlug()).commit(); 

tut eine Sache

@Override 
public void onBackPressed() { 
     FragmentManager fm = getFragmentManager(); 
     if(fm.getBackStackEntryCount() == 1){ 
     fm.popBackStack ("YOUR_TAG",FragmentManager.POP_BACK_STACK_INCLUSIVE); 
     } 
     super.onBackPressed(); 
     } 
+0

In loadcategories Fragment wird nur in Backstack eingefügt, wenn Benutzer auf Listenelement –

+0

klicken, aber Sie rufen es von oncreate(). Das heißt, wenn die Aktivität startet, wird sie zum Backstack hinzugefügt. Versuchen Sie dann loadcategories() für das click-Ereignis listItem aufzurufen. nicht in onCreate. Danke, es wird dir helfen :) –

0
Try to make own switch like: 
import android.support.v4.app.Fragment; 
and make switch case and use it like this: 

case 44: { 

       page = 44; 

       fragment = new FragmentOne(); 
       getSupportActionBar().setTitle(R.string.page_44); 

       action = true; 

       break; 
      } 
if (action) { 
      FragmentManager fragmentManager = getSupportFragmentManager(); 
      fragmentManager.beginTransaction() 
        .replace(R.id.container_body, fragment) 
        .commit(); 
     } 


and finally in 
backpress(){ 

displayView(44);} 
0

wenn Sie meinen, dass Ihre App zeigen leeres Fragment, das nicht da sein sollte, dann müssen Sie Ihr Fragment Transaktion bearbeiten, Fragment aus dem Behälter erhalten und fügen Sie eine Bedingung hinzu, um es dem Backstack hinzuzufügen, wenn das erste Fragment nicht null ist. siehe Beispiel unten

Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.content_frame); 
FragmentManager fm = getSupportFragmentManager(); 
FragmentTransaction ft = fm.beginTransaction(); 
ft.replace(R.id.content_frame, feedFragment) 
if(fragment != null){ 
    ft.addToBackStack(categoriesDTO.getCategories().get(position).getSlug()); 
} 
ft.commit(); 

ich hoffe, dass diese Hilfe :)

0

ich hinzufügen fragmets wie folgt aus:

private void addTransaction(Fragment fragment) { 
    FragmentTransaction ft = getFragmentManager().beginTransaction(); 
    ft.replace(R.id.content_frame, fragment, "visible_fragment"); 
    ft.addToBackStack(null); 
    ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE); 
    ft.commit(); 
} 

Ich verwende dieses Fragment Transaktionen verwalten auf Zurück-Taste gedrückt:

public boolean onKeyDown(int keyCode, KeyEvent event) { 
    if (keyCode == KeyEvent.KEYCODE_BACK) { 
     if (drawer.isDrawerOpen(GravityCompat.START)) { 
      drawer.closeDrawer(Gravity.LEFT); //CLOSE Nav Drawer! 
     } else { 
      if (getFragmentManager().getBackStackEntryCount() == 0) { 
       this.finish(); 
       return false; 
      } 

      if (getFragmentManager().getBackStackEntryCount() > 1) { 
       getFragmentManager().popBackStack(); 
       removeCurrentFragment(); 
       return false; 
      } 
     } 
    } 
    return super.onKeyDown(keyCode, event); 
} 

Um das aktuelle Fragment aus dem Backstack zu entfernen

zu behandeln Änderung auf Backstack Sie haben FragmentManager.OnBackStackChangedListener auf Ihre Aktivität implementiert und @OverrideonBackStackChanged() Verfahren, wie zum Beispiel:

@Override 
public void onBackStackChanged() { 
    // Get your current fragment 
    Fragment fragment = getFragment(); 

    // Update your UI such as title, drawer selected options, etc 
} 

private Fragment getFragment() { 
    return getFragmentManager().findFragmentByTag("visible_fragment"); 
} 

Hoffe, es hilft.

Verwandte Themen