2015-03-12 18 views
6

Sto provando a creare un'app Android Wear che ha solo un'attività con un frammento al suo interno. Voglio essere in grado di cambiare i frammenti in base ai clic del pulsante o ad altre azioni dell'utente.Usura Android Backstack non funzionante

Posso sostituire i frammenti bene; tuttavia, quando scorro dal lato sinistro dello schermo verso il lato destro dello schermo. L'app si chiude. Mi aspettavo che questo sfioramento si comportasse come un pulsante indietro e non uscire dall'app.

Attività principale

import android.support.v4.app.Fragment; 
import android.os.Bundle; 
import android.support.v4.app.FragmentActivity; 
import android.support.v4.app.FragmentManager; 
import android.support.v4.app.FragmentTransaction; 
import android.support.wearable.view.WatchViewStub; 


public class MainActivity extends FragmentActivity implements FragmentChangeListener { 

    int fragmentContainerId; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main_activity); 
     final WatchViewStub stub = (WatchViewStub)findViewById(R.id.watch_view_stub); 


     // instialize the fragment to the loading page 
     stub.setOnLayoutInflatedListener(new WatchViewStub.OnLayoutInflatedListener() { 
      @Override 
      public void onLayoutInflated(WatchViewStub watchViewStub) { 
       fragmentContainerId = R.id.fragmentContainer; 

       if (watchViewStub.findViewById(R.id.fragmentContainer) != null) { 




        Fragment1 fragment1= new Fragment1(); 

        // In case this activity was started with special instructions from an Intent, 
        // pass the Intent's extras to the fragment as arguments 
        fragment1.setArguments(getIntent().getExtras()); 

        // Add the fragment to the 'fragment_container' 
        FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); 
        fragmentTransaction.add(R.id.fragmentContainer, fragment1).addToBackStack(null); 
        fragmentTransaction.commit(); 
       } 
      } 
     }); 
    } 

    @Override 
    public void replaceFragment(Fragment fragment) { 
     FragmentManager fragmentManager = getSupportFragmentManager(); 
     FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
     fragmentTransaction.replace(R.id.fragmentContainer, fragment, fragment.toString()).addToBackStack(null); 
     System.out.println("Entry count in backstack is: " + fragmentManager.getBackStackEntryCount()); 
     fragmentTransaction.commit(); 
    } 
} 

Frammento 1

import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.Button; 



public class Fragment1 extends Fragment { 


    public Fragment1() { 
     // Required empty public constructor 
    } 


    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     // Inflate the layout for this fragment 
     View view = inflater.inflate(R.layout.fragment1, 
       container, false); 

     Button button1= (Button)view.findViewById(R.id.button1); 

     button1.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

       Fragment2 fragment2= new Fragment2(); 
       FragmentChangeListener fc=(FragmentChangeListener)getActivity(); 
       fc.replaceFragment(fragment2); 
      } 
     }); 
     return view; 
    } 
} 

Frammento 2

import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.Button; 


/** 
* A simple {@link Fragment} subclass. 
*/ 
public class Fragment2 extends Fragment { 


    public Fragment2() { 
     // Required empty public constructor 
    } 


    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     // Inflate the layout for this fragment 
     View v =inflater.inflate(R.layout.fragment2, container, false); 

     return v; 
    } 


} 

FragmentChangeListner

import android.support.v4.app.Fragment; 


public interface FragmentChangeListener 
{ 
    public void replaceFragment(Fragment fragment); 
} 

Se navigando da Fragment1 al Fragment2 tramite il clic del pulsante. Come posso tornare a Fragment1 senza uscire dall'app?

+0

hai già trovato una soluzione? –

risposta

0

C'è una soluzione potenzialmente hacky che è possibile utilizzare se si considera invece l'utilizzo della classe GridViewPager. Ti consente di scorrere all'indietro per visualizzare il contenuto precedente. Dovresti aggiornare le viste sullo scorrimento per simulare un backstack dinamico, ma può essere fatto.

1

Una soluzione potrebbe essere quella di avvolgere il vostro secondo layout all'interno di una

android.support.wearable.view.SwipeDismissFrameLayout

Poi si può catturare il gesto respingere e dentro la chiamata di attività genitore getFragmentManager().popBackStack();

è possibile impostare ascoltatore sulla SwipeDismissFrameLayout come quindi: swipeFrame.setDismissEnabled(true); swipeFrame.setOnDismissedListener(new SwipeDismissLayout.OnDismissedListener() { @Override public void onDismissed(SwipeDismissLayout swipeDismissLayout) { getActivity().getFragmentManager().popBackStack(); } });

Problemi correlati