Android'de gizle parçasını göster


100

2 fragman içeren uygulama geliştiriyorum ve ihtiyacıma göre post göstermek istiyorum. Aşağıdaki kod, sorunumun basit bir örneğini içerir. Bu basit Fragmentactivity, 1 düğme ve bir liste parçası içerir.

Bu basit örnek kusursuz çalışıyor. ama show hide fragmanından memnun değilim. Layout.setVisibility (View.GONE) öğesini kaldırırsanız; koddan sonra ft.hide (f); parçayı gizlemeyecek. Aslında biz parçayı saklamıyoruz, biz konteynerleri saklıyoruz.

Sorum şu, bu parçaları gizlemenin bir yolu mu? Aksi takdirde, lütfen test edilmiş örnekle açıklayın Parçaların nasıl gizleneceğini ve gösterileceğini çünkü birçok insan bu sorunla karşı karşıya.

 public class MainActivity extends FragmentActivity implements OnClickListener {

        Fragment1 f;
        Button b;
        LinearLayout layout;
        Fragment myf;
        @Override
        public void onCreate(Bundle savedInstanceState){
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            b = (Button) findViewById(R.id.button1);
            layout = (LinearLayout) findViewById(R.id.ll);
            f = new Fragment1();
        }

        @Override
        public void onClick(View v) {

            FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
            ft.setCustomAnimations(android.R.animator.fade_in, android.R.animator.fade_out);

            if (f.isHidden()) {
                ft.show(f);
                layout.setVisibility(View.VISIBLE);
                b.setText("Hide");
            } else {
                ft.hide(f);
                b.setText("Show");
                layout.setVisibility(View.GONE);
            }
            ft.commit();
            // TODO Auto-generated method stub
        }

Neden konteynerin görünürlüğünü ayarlamanız gerekiyor? Görünürlüğü ayarlamadan çalışmalıdır.
Andrii Çernenko

Kesinlikle konteyner görünmeden çalışmalı ama çalışmıyor. Lütfen lütfen basit çalışma örneğini benimle paylaşın. O zaman nerede kaybolduğumu bilirim.
abidkhan303

1
Benim tahminim, her seferinde farklı parça örneğini göstermeye / gizlemeye çalıştığınızdır. Parçanızı eklediğinizde (bu arada bu kod parçasını görmüyorum) etiketiyle ekleyin ve ardından bu etiketle alın (referansını saklamaya çalışmak yerine). Eksik olan şey bu olabilir.
Andrii Chernenko

Yanıtlar:


162

Kabın görünürlük bayraklarıyla uğraşmayın - FragmentTransaction.hide / show bunu sizin için dahili olarak yapar.

Yani bunu yapmanın doğru yolu şudur:

FragmentManager fm = getFragmentManager();
fm.beginTransaction()
          .setCustomAnimations(android.R.animator.fade_in, android.R.animator.fade_out)
          .show(somefrag)
          .commit();

VEYA android.support.v4.app.Fragment kullanıyorsanız

 FragmentManager fm = getSupportFragmentManager();
 fm.beginTransaction()
          .setCustomAnimations(android.R.anim.fade_in, android.R.anim.fade_out)
          .show(somefrag)
          .commit();

5
Neden doğrudan bayraklarla uğraşmamayı öneriyorsunuz? (
Önerinize

1
Evet, bunu orijinal mesajınızda okudum. Fazladan ek yük için gerekçe ekleyebileceğinizi umuyordum. Bu arada, arka yığına ekleme seçeneği gibi bazılarını keşfettim.
Ellen Spertus

2
Hataya meyillidir çünkü bayraklarınızı düşük seviyeli api ve yüksek seviyeli api'de değiştirebilir ve dikkatli değilseniz (yani bayraklar senkronize olmazsa) tuhaf hataların peşinde olabilirsiniz. Bu nedenle, parçalarınızı gizlemek ve göstermek için parça yöneticisini kullanmanız önerilir.
numan salati

Merhaba @numansalati, sürümü (destek kütüphane itibaren) herhangi uyumluluk vardır android.R.animator.fade_inve android.R.animator.fade_out?
Solace

1
Kapla, GÖSTER, GİZLE veya GİTTİ olarak ayarlayabilirsiniz. Bir parçayı gizlerken GONE seçeneği yoktur.
Stealth Rabbi

59

Eklemede, bir Parçada yapabilirsiniz (örneğin, sunucu verilerini alma başarısız olduğunda):

 getView().setVisibility(View.GONE);

11
Fragment, Object'in bir alt öğesidir ve View değil, bu nedenle şu çağrılamaz: fragment.setVisibility (View.INVISIBLE);
AndroidGeek

8
Arià farklı bir şey öneriyor, o parçadan görüş almayı ve görünürlüğünü ortadan kaldırmayı öneriyor.
AlvaroSantisteban

10
Henüz başlatılmadığında dikkatli getView()olunabilir null.
TWiStErRob

23

Merhaba, bu yaklaşımı kullanarak yaparsınız, tüm parçalar başlangıçta eklendikten sonra kapta kalır ve ardından basitçe istenen parçayı ortaya çıkarır ve diğerlerini kap içinde gizleriz.

// Within an activity
private FragmentA fragmentA;
private FragmentB fragmentB;
private FragmentC fragmentC;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    if (savedInstanceState == null) {
        fragmentA = FragmentA.newInstance("foo");
        fragmentB = FragmentB.newInstance("bar");
        fragmentC = FragmentC.newInstance("baz");
    }
}


// Replace the switch method
protected void displayFragmentA() {
    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    if (fragmentA.isAdded()) { // if the fragment is already in container
        ft.show(fragmentA);
    } else { // fragment needs to be added to frame container
        ft.add(R.id.flContainer, fragmentA, "A");
    }
    // Hide fragment B
    if (fragmentB.isAdded()) { ft.hide(fragmentB); }
    // Hide fragment C
    if (fragmentC.isAdded()) { ft.hide(fragmentC); }
    // Commit changes
    ft.commit();
}

Daha fazla bilgi için lütfen https://github.com/codepath/android_guides/wiki/Creating-and-Using-Fragments adresine bakın . Umarım birine yardım edebilirim. Bu eski bir soru olsa bile.


1
yani displayFragmentB () ve displayFragmentC () gibi iki yönteme daha ihtiyacınız var?
temirbek

yes @temirbek displayFragmentA () metodunun nasıl uygulandığını takip edebilirsiniz.
mangu23

1
Eğer bir etkinlik (2 veya daha fazla) birçok parçalarını varsa ve yukarıdaki yöntemi kullandığınızı varsa, lütfen bunları bu . Yazması ve okuması daha kolay olacak.
Maxime Claude

8
public void showHideFragment(final Fragment fragment){

    FragmentTransaction ft = getFragmentManager().beginTransaction();
    ft.setCustomAnimations(android.R.animator.fade_in,
                    android.R.animator.fade_out);

    if (fragment.isHidden()) {
        ft.show(fragment);
        Log.d("hidden","Show");
    } else {
        ft.hide(fragment);
        Log.d("Shown","Hide");                        
    }

    ft.commit();
}

1
doğru olan ft.setCustomAnimations (android.R.anim.fade_in, android.R.anim.fade_out);
Webserveis

8

Bunu dene:

MapFragment mapFragment = (MapFragment)getFragmentManager().findFragmentById(R.id.mapview);
mapFragment.getView().setVisibility(View.GONE);

2

Kodumdan, yukarıdaki çözüme kıyasla, en basit yol, parçayı içeren bir düzen tanımlamaktır, ardından genel görünümle hizalanan düzen özniteliğini kontrol ederek parçayı gizleyebilir veya gösterebilirsiniz. Bu durumda ek kod gerekmez ve parçanın ek dağıtım öznitelikleri dış düzene taşınabilir.

<LinearLayout style="@style/StHorizontalLinearView"
    >

    <fragment
        android:layout_width="match_parent"
        android:layout_height="390dp"
        android:layout_alignParentTop="true"
        />

</LinearLayout>

1
final Fragment fragment1 = new fragment1();
final Fragment fragment2 = new fragment2();
final FragmentManager fm = getSupportFragmentManager();
Fragment active = fragment1;

OnCreate'de setContentView'dan sonra iki parça sakladım ve bunları parça yöneticisine teslim ettim, ancak ev olarak hizmet verecek ilk parçayı saklamadım.

fm.beginTransaction().add(R.id.main_container, fragment2, "2").hide(fragment2).commit();
fm.beginTransaction().add(R.id.main_container,fragment1, "1").commit();
 @Override
    public void onClick(View v) {
        Fragment another = fragment1;
         if(active==fragment1){
          another = fragment2;
         }
            fm.beginTransaction().hide(active).show(another).commit();
            active = another;
}

Referans: https://medium.com/@oluwabukunmi.aluko/bottom-navigation-view-with-fragments-a074bfd08711


1

Çok geç kalmış olabilirim ama gelecekte birine yardımcı olabilir.
Bu cevap için bir değişikliktir mangu23 cevap
Sadece önlemek tekrarı için bir for döngüsü eklendi ve kolayca Demirbaş kodu olmadan yeni parçalar eklemek için.

Öncelikle gösterilmesi gereken parçaların bir listesine ihtiyacımız var

public class MainActivity extends AppCompatActivity{
    //...
    List<Fragment> fragmentList = new ArrayList<>();
}

O zaman onu parçalarımızla doldurmalıyız

@Override
protected void onCreate(Bundle savedInstanceState) {
    //...
    HomeFragment homeFragment = new HomeFragment();
    MessagesFragment messagesFragment = new MessagesFragment();
    UserFragment userFragment = new UserFragment();
    FavoriteFragment favoriteFragment = new FavoriteFragment();
    MapFragment mapFragment = new MapFragment();

    fragmentList.add(homeFragment);
    fragmentList.add(messagesFragment);
    fragmentList.add(userFragment);
    fragmentList.add(favoriteFragment);
    fragmentList.add(mapFragment);
}

Ve listeden hangi parçanın seçildiğini bilmenin bir yoluna ihtiyacımız var, bu yüzden getFragmentIndexfonksiyona ihtiyacımız var

private int getFragmentIndex(Fragment fragment) {
    int index = -1;
    for (int i = 0; i < fragmentList.size(); i++) {
        if (fragment.hashCode() == fragmentList.get(i).hashCode()){
            return i;
        }
    }
    return index;
}

Ve son olarak, displayFragmentyöntem şöyle olacak:

private void displayFragment(Fragment fragment) {
        int index = getFragmentIndex(fragment);
        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
        if (fragment.isAdded()) { // if the fragment is already in container
            transaction.show(fragment);
        } else { // fragment needs to be added to frame container
            transaction.add(R.id.placeholder, fragment);
        }
        // hiding the other fragments
        for (int i = 0; i < fragmentList.size(); i++) {
            if (fragmentList.get(i).isAdded() && i != index) {
                transaction.hide(fragmentList.get(i));
            }
        }
        transaction.commit();
    }

Bu şekilde displayFragment(homeFragment)mesela arayabiliriz .
Bu HomeFragment, listedeki diğer parçaları otomatik olarak gösterecek ve gizleyecektir.
Bu çözüm , eski sürümdeki ifadeleri fragmentListtekrarlamanıza gerek kalmadan daha fazla parça eklemenizi sağlar . Umarım birisi bunu faydalı bulacaktır.ifdisplayFragment


0

Bu benim için çalıştı

FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
        if(tag.equalsIgnoreCase("dashboard")){

            DashboardFragment dashboardFragment = (DashboardFragment)
                    fragmentManager.findFragmentByTag("dashboard");
            if(dashboardFragment!=null) ft.show(dashboardFragment);

            ShowcaseFragment showcaseFragment = (ShowcaseFragment)
                    fragmentManager.findFragmentByTag("showcase");
            if(showcaseFragment!=null) ft.hide(showcaseFragment);

        } else if(tag.equalsIgnoreCase("showcase")){
            DashboardFragment dashboardFragment = (DashboardFragment)
                    fragmentManager.findFragmentByTag("dashboard");
            if(dashboardFragment!=null) ft.hide(dashboardFragment);

            ShowcaseFragment showcaseFragment = (ShowcaseFragment)
                    fragmentManager.findFragmentByTag("showcase");
            if(showcaseFragment!=null) ft.show(showcaseFragment);
        }

        ft.commit();

0

buradaki cevaplar doğrudur ve @ Jyo the Whiff şov fikrini beğendim ve şu anda sahip olduğu yol dışında fragman uygulamasını gizle, ilk çalıştırmada parçayı gizleyecekti, bu yüzden küçük bir değişiklik ekledim, ekledim kontrol ve göster parça zaten değilse

public void showHideCardPreview(int id) {
    FragmentManager fm = getSupportFragmentManager();
    Bundle b = new Bundle();
    b.putInt(Constants.CARD, id);
    cardPreviewFragment.setArguments(b);
    FragmentTransaction ft = fm.beginTransaction()
        .setCustomAnimations(android.R.anim.fade_in, android.R.anim.fade_out);
    if (!cardPreviewFragment.isAdded()){
        ft.add(R.id.full_screen_container, cardPreviewFragment);
        ft.show(cardPreviewFragment);
    } else {
        if (cardPreviewFragment.isHidden()) {
            Log.d(TAG,"++++++++++++++++++++ show");
            ft.show(cardPreviewFragment);
        } else {
            Log.d(TAG,"++++++++++++++++++++ hide");
            ft.hide(cardPreviewFragment);
        }
    }

    ft.commit();
} 
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.