2015-04-22 11 views
10

मैं एप्लिकेशन का विकास किया है, कि मैं एक टुकड़ा लेन-देन है,एंड्रॉयड टुकड़ा, देखने नहीं हटाया जाता है

MainActivityFragment View शामिल हैं।

MainActivity, स्क्रीन के शीर्ष पर तीन Button है कि एक ही केवल MainActivityFragment हिस्सा परिवर्तन रहने जब हम एक और Fragment को यह Activity जाना, जब हम तीन में से क्लिक करें।

लेकिन, मेरी समस्या यह है कि जब मैं से स्थानांतरित इस MainActivityFragment करने के लिए जब यह ठीक है, लेकिन जब मैं Second-Button पर क्लिक करें, परिणाम एक और Fragment करने के लिए पहले Fragment के साथ स्क्रीन के ऊपर लिख है First-Button पर क्लिक करें।

यह एक ही Activity में है, इसलिए, मैं के माध्यम से remove(fr).commit();

Fragment नहीं निकाल सकते, तो मुझे लगता है कि फिर यह बन कर गैर क्लिक करने योग्य टुकड़ा इसलिए अगले बटन को क्लिक पर प्रतिक्रिया नहीं हटाने हो सकता है क्योंकि।

कुल परिणाम, यह दोनों FirstFragment और NewFragment स्क्रीन प्रदर्शित करते हैं, जब मैं NewFragment में ले जाएँ मैं कैसे FirstFragment स्क्रीन निकालना चाहते हैं?

MainActivity तीन बटन में परिवर्तित करने के लिए निम्न कोड है टुकड़ा:

मुख्य गतिविधि:

<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/> 

पहले टुकड़ा:

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; 
    } 
}  

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();                 
    }                         
});  

इसके निम्नलिखित की तरह xml फ़ाइल

दूसरा टुकड़ा:

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; 
    } 
}  

लेकिन जब क्लिक एक बटन दूसरे करने के लिए Fragment बटन पर यह दोनों पहले और दूसरे Fragment स्क्रीन प्रदर्शित करते हैं।

तो इसे कैसे हल करें और दूसरा क्लिक करते समय पहले दृश्य को कैसे हटाएं?

मैं इस

fragmentTransaction.remove(fr).commit(); 

और इस

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

इस्तेमाल किया, लेकिन यह काम नहीं कर रहा।

+0

कृपया अपना न्यूफ्रैगमेंट क्लास –

+0

या फिर सुनिश्चित करें, संपादित प्रश्न देखें –

+2

आपके पास एक एम्बेडेड टुकड़ा नहीं है (जिसे खंड टैग के साथ एक्सएमएल लेआउट में घोषित किया गया है) जो आप लेनदेन करते हैं (जैसे प्रतिस्थापन)। तो उस खंड टैग के बजाय एक साधारण फ्रेमलेआउट डालें और गतिविधि के ऑनक्रेट() विधि में मैन्युअल रूप से टुकड़ा जोड़ें। – Luksprog

उत्तर

12

लेआउट में घोषित टुकड़ा एंड्रॉइड द्वारा अलग-अलग व्यवहार किया जाता है।एक FrameLayout, या अपनी पसंद के ViewGroup का एक उपवर्ग के साथ

<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"/> 

बदलें, और प्रोग्राम के रूप में सभी लेनदेन संभाल। बाकी मुझे अच्छा लग रहा है

0

आप इसका उपयोग कर सकते हैं: getSupportFragmentManager().beginTransaction().remove(fragment).commit(); आशा है कि इससे मदद मिलेगी।

+0

हैलो @ अहमद अलसनी कृपया मेरा संपादित प्रश्न देखें –

1

एक्सएमएल में हार्ड कोड किए गए टुकड़े प्रतिस्थापित नहीं किए जा सकते हैं।FramLayout का उपयोग इसके बजाय एक खंड कंटेनर के रूप में करें।

अपने एक्सएमएल में

की जगह

<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/> 

साथ

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

अब, अपने लक्ष्य को प्राप्त करने के लिए निम्न कोड शैली का अनुसरण करें:

पहले सभी imageviews को onClickListeners सेट: जैसे: 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."); 
       } 
      } 

उम्मीद है कि इससे मदद मिलती है।

0

आवश्यक परिवर्तन करें। अपनी गतिविधि और एक्सएमएल को इसके साथ बदलें। यदि आप ऐसा करते हैं तो इसे ठोस चलाना चाहिए।

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();                
    } 
}); 

एक्सएमएल

<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

जब मैं NewFragment में ले जाएँ मैं कैसे पहले frament स्क्रीन निकालना चाहते हैं?

अच्छी तरह से आप कर सकते हैं वर्ष (प्रथम) छुपा कर Fragmentsource

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

आप भी उसे (प्रथम खंड) एक ही दृष्टिकोण से प्राप्त कर सकते हैं कि वापस source

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

यह दृष्टिकोण लचीलापन खरीदता है और आपके ऐप के आर्किटेक्चर को फिर से बदलता नहीं है, और तर्क, और काम की एक पंक्ति

im हमेशा एक पार्टी (करने के लिए देर से:

4

इसके बेहतर एक viewGroup या एक लेआउट का उपयोग करने/टुकड़े के बजाय FrameLayout (एक गतिविधि में बटन क्लिक पर टुकड़ा नेविगेशन)। चूंकि टुकड़ों में अपनी जीवनशैली होती है और टुकड़े में बड़े विचार होते हैं या जब आप किसी गतिविधि के भीतर खंड संक्रमण करते हैं तो मारे नहीं जाते हैं।

यद्यपि यदि आप अभी भी टुकड़े के साथ जाना चाहते हैं, तो पहले पहले बटन के एक टुकड़े को लोड करें और पहले से जुड़े टुकड़े को हटाकर अन्य दो बटनों की क्लिक घटनाओं को संभालें (पहले बटन क्लिक से जुड़ा हुआ टुकड़ा)।

यह द्वारा किया जा सकता:

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

और इस के बाद आप इस जगह में टुकड़ा जोड़ने के लिए, getFragmentManager().beginTransaction().replace(YOUR_FIRST_FRAGMENT, new YourSecondButtonFragment()).commit(); एक कोड लिख सकते हैं और इसलिए यह अपने तीसरे बटन क्लिक करने के लिए किया जा सकता है भी, बस की जरूरत है दूसरे बटन से जुड़े टुकड़े को बदलें।

मुझे आशा है कि यह आपकी मदद करेगा।

-1

अपने बटन क्लिक ईवेंट में कॉपी और कीट कोड।

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

यह पूरा काम पूरा हो गया है।

संबंधित मुद्दे