2015-04-22 30 views
10

Ich habe eine App entwickelt, entfernt, dass ich ein Fragment Transaktion haben,Android Fragment, Ansicht nicht

MainActivity enthält Fragment View.

MainActivity haben drei Button oben auf dem Bildschirm, die gleich bleiben, wenn wir diese Activity zu einem anderen Fragment gehen, nur MainActivityFragment Teil ändern, wenn wir aus drei klicken.

Aber mein Problem ist, dass, wenn ich von der diese MainActivity-Fragment wenn Klick auf First-Button bewegen, die in Ordnung ist, aber wenn ich auf Second-Button klicken, Ergebnis ist der Bildschirm mit ersten Fragment auf einen anderen Fragment überschreiben.

ist es in derselben Activity so, ich nicht Fragment durch remove(fr).commit();

entfernen Denn wenn ich tun, dass es dann nicht anklickbar Fragment so nicht Antwort auf Klick auf Next-Button können entfernen.

Gesamter, zeigen Sie es sowohl FirstFragment und NewFragment Bildschirm, wenn ich zu NewFragment bewegen, wie ich den FirstFragment Bildschirm entfernen?

In MainActivity Drei-Tasten haben folgenden Code ändern Fragment:

Hauptaktivität:

public class MasterActivity extends Activity {     
    ImageView imgOne, imgTwo, imgThree; 
    Fragment fr;            

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

    setContentView(R.layout.activity_master);    

    imgOne = (ImageView) findViewById(R.id.imgOne);  
    imgTwo = (ImageView) findViewById(R.id.imgTwo);  
    imgThree = (ImageView) findViewById(R.id.imgThree); 


imgOne.setOnClickListener(new View.OnClickListener() {             

     @Override                       
     public void onClick(View v) {                  
    // TODO Auto-generated method stub                
    fr = new FirstFragment();                   

    FragmentManager fm = getFragmentManager();              
    FragmentTransaction fragmentTransaction = fm.beginTransaction();        
    fragmentTransaction.replace(R.id.fragment_place, fr);           
    fragmentTransaction.addToBackStack(null);              
    //fragmentTransaction.remove(fr).commit();              
    //getFragmentManager().beginTransaction().remove(fr).commit();         
    fragmentTransaction.commit();                 
    }                         
    });                         

    imgTwo.setOnClickListener(new View.OnClickListener() {             

    @Override                       
    public void onClick(View v) {                  
     // TODO Auto-generated method stub                


    fr = new SecondFragment();                   

    FragmentManager fm = getFragmentManager();              
    FragmentTransaction fragmentTransaction = fm.beginTransaction();        
    fragmentTransaction.replace(R.id.fragment_place, fr);           
    fragmentTransaction.addToBackStack(null);              
    //fragmentTransaction.remove(fr).commit();              
    // getFragmentManager().beginTransaction().remove(fr).commit();         
    fragmentTransaction.commit();                 
    }                         
});  

seine XML-Datei wie folgt vor:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" > 

    <LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="50dp" 
    android:background="#000000" 
    android:gravity="bottom" 
    android:weightSum="3" > 

    <ImageView 
     android:id="@+id/imgOne" 
     android:layout_width="0dp" 
     android:layout_height="27dp" 
     android:layout_gravity="center" 
     android:layout_weight="1" 
     android:src="@drawable/img1" /> 

    <ImageView 
     android:id="@+id/imgTwo" 
     android:layout_width="0dp" 
     android:layout_gravity="center" 
     android:layout_height="27dp" 
     android:layout_weight="1" 
     android:src="@drawable/img2"/> 
    <ImageView 
     android:id="@+id/imgThree" 
     android:layout_width="0dp" 
     android:layout_gravity="center" 
     android:layout_height="27dp" 
     android:layout_weight="1" 
     android:src="@drawable/img3" /> 
</LinearLayout> 

<fragment 
    android:id="@+id/fragment_place" 
    android:name="packagename.FirstFragment" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_weight="0.87"/>  
    <LinearLayout/> 
<LinearLayout/> 

Erster Teil:

public class FirstFragment extends Fragment { 

    @Override 
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
     View r = inflater.inflate(R.layout.first_fratgment, container, false); 

     return r; 
    } 
}  

Zweiter Teil:

public class SecondFragment extends Fragment { 

    @Override 
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
     View r = inflater.inflate(R.layout.second_fratgment, container, false); 

     return r; 
    } 
}  

Aber wenn Klick auf eine Schaltfläche Fragment-Taste, um eine andere es sowohl erste als auch zweite Fragment Bildschirme anzuzeigen.

Also, wie man es löst und wie man die erste Ansicht beim zweiten Klick entfernt?

ich verwendet, um dieses

fragmentTransaction.remove(fr).commit(); 

und dieses

getFragmentManager().beginTransaction().remove(fr).commit(); 

aber es funktioniert nicht.

+0

bitte posten Sie Ihre NewFragment-Klasse –

+0

ya sicher, siehe bearbeitete Fragen –

+2

Sie können kein eingebettetes Fragment haben (eines im XML-Layout mit dem Fragment-Tag deklariert), mit dem Sie Transaktionen durchführen (wie replace). Anstatt dieses Fragment-Tags fügen Sie ein einfaches FrameLayout hinzu und fügen das Fragment manuell in die onCreate() -Methode der Aktivität ein. – Luksprog

Antwort

12

Im Layout deklarierte Fragmente werden von Android anders behandelt.Ersetzen

<fragment 
    android:id="@+id/fragment_place" 
    android:name="packagename.FirstFragment" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_weight="0.87"/> 

mit einem FrameLayout oder einer Unterklasse von ViewGroup Ihrer Wahl, und behandelt alle Transaktionen programmatisch. Der Rest sieht gut aus für mich

0

können Sie verwenden: getSupportFragmentManager().beginTransaction().remove(fragment).commit(); Hoffe, dass dies helfen wird.

+0

hallo @ahmad Alsanie bitte meine bearbeitete Frage –

1

Fragmente, die in XML fest codiert sind, können nicht ersetzt werden. Verwenden Sie stattdessen die FramLayout als Fragment Container.

in Ihrem XML ersetzen

<fragment 
    android:id="@+id/fragment_place" 
    android:name="packagename.FirstFragment" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_weight="0.87"/>  
    <LinearLayout/> 

mit

<FrameLayout 
    android:id="@+id/contentFragment" 
    android:layout_width="match_parent" 
    android:layout_height="0px" 
    android:layout_weight="2" /> 

nun Sie dem folgenden Code Stil folgen um Ihr Ziel zu erreichen:

Sie zunächst die onClickListeners alle imageviews: wie: imgOne.setOnClickListener(this);

  @Override 
      public void onClick(View v) { 
       Fragment fragment = null; 
       switch (v.getId()) { 
        case R.id.imgOne: 
         fragment = new Fragment1(); 
         break; 
        case R.id.imgTwo: 
         fragment = new Fragment2(); 
         break; 
       } 
       if (fragment != null) { 
        FragmentManager fm = getSupportFragmentManager(); 
        fm.beginTransaction().replace(R.id.contentFragment, fragment).commit();       
       } else { 
        Log.e(LOG_TAG, "Error in fragment transaction."); 
       } 
      } 

Hoffe das hilft.

0

Notwendige Änderungen vornehmen. Ersetzen Sie Ihre Aktivität und XML mit diesem. Es sollte solide laufen, wenn Sie dies tun.

public class MasterActivity extends Activity {     
ImageView imgOne, imgTwo, imgThree; 
Fragment fr;            

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

setContentView(R.layout.activity_master);    

imgOne = (ImageView) findViewById(R.id.imgOne);  
imgTwo = (ImageView) findViewById(R.id.imgTwo);  
imgThree = (ImageView) findViewById(R.id.imgThree); 

getFragmentManager().beginTransaction().add(R.id.fragment_place, new FirstFragment()).commit(); 


imgOne.setOnClickListener(new View.OnClickListener() {             
    @Override                       
    public void onClick(View v) {  
     getFragmentManager().beginTransaction().replace(R.id.fragment_place, new FirstFragment()).commit(); 
    }                         
});                         

imgTwo.setOnClickListener(new View.OnClickListener() { 
    @Override                       
    public void onClick(View v) {                  
     getFragmentManager().beginTransaction().replace(R.id.fragment_place, new SecondFragment()).commit();                
    } 
}); 

xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:orientation="vertical" > 

<LinearLayout 
android:layout_width="match_parent" 
android:layout_height="50dp" 
android:background="#000000" 
android:gravity="bottom" 
android:weightSum="3" > 

<ImageView 
    android:id="@+id/imgOne" 
    android:layout_width="0dp" 
    android:layout_height="27dp" 
    android:layout_gravity="center" 
    android:layout_weight="1" 
    android:src="@drawable/img1" /> 

<ImageView 
    android:id="@+id/imgTwo" 
    android:layout_width="0dp" 
    android:layout_gravity="center" 
    android:layout_height="27dp" 
    android:layout_weight="1" 
    android:src="@drawable/img2"/> 
<ImageView 
    android:id="@+id/imgThree" 
    android:layout_width="0dp" 
    android:layout_gravity="center" 
    android:layout_height="27dp" 
    android:layout_weight="1" 
    android:src="@drawable/img3" /> 
</LinearLayout> 

<FrameLayout 
android:id="@+id/fragment_place" 
android:layout_width="match_parent" 
android:layout_height="wrap_content" 
android:layout_weight="0.87"/>  
<LinearLayout/> 
<LinearLayout/> 
0

, wenn ich zu NewFragment bewegen, wie ich den ersten frament Bildschirm entfernen?

gut Sie können (ersten) tun, dass die alten durch Ausblenden Fragmentsource

getSupportFragmentManager().beginTransaction().hide(getSupportFragmentManager() 
         .findFragmentById(R.id.the_id_of_my_first_fragment)); 

Sie können auch er (das erste Fragment) wieder mit dem gleichen Ansatz source

getSupportFragmentManager().beginTransaction().show(getSupportFragmentManager() 
         .findFragmentById(R.id.the_id_of_my_first_fragment)); 

Dieser Ansatz bietet Flexibilität und ersetzt nicht die Architektur und Logik Ihrer App sowie eine Arbeitslinie

im immer zu spät zu einer Party (:

4

Es ist besser, eine Viewgroup zu verwenden oder ein Layout/FrameLayout statt Fragmente (Fragment Navigations auf Mausklicks in einer Aktivität). Weil Fragmente ihren eigenen Lebenszyklus haben und Fragmente ihre Ansichten beibehalten oder nicht getötet werden, wenn Sie den Übergang innerhalb einer Aktivität fragmentieren.

Wenn Sie immer noch mit einem Fragment arbeiten möchten, laden Sie zunächst ein Fragment des ersten Klickens und behandeln Sie die Klickereignisse der anderen beiden Schaltflächen, indem Sie das zuvor angefügte Fragment entfernen (Fragment beim ersten Klick).

Dies kann geschehen durch:

getSupportFragmentManager().beginTransaction().remove(YOUR_FIRST_FRAGMENT).commit(); 

und danach können Sie einen Code hinzufügen Fragment an diesem Ort, getFragmentManager().beginTransaction().replace(YOUR_FIRST_FRAGMENT, new YourSecondButtonFragment()).commit(); schreiben und somit kann dies auch für die dritte Schaltfläche klicken getan werden, müssen nur Ändere das an die zweite Schaltfläche angehängte Fragment.

Ich hoffe, das wird Ihnen helfen.

-1

Kopieren und Schädlingscode in Ihrem Button-Klick-Ereignis.

fr = new FirstFragment(); 
fragmentManager = getSupportFragmentManager(); 
fragmentTransaction = fragmentManager.beginTransaction(); 
fragmentTransaction.replace(R.id.fragment_place, fr);           
fragmentTransaction.commit(); 

Dies ist abgeschlossene Arbeit.

Verwandte Themen