Geçerli parça nesnesini al


175

Benim main.xmlvar

  <FrameLayout
        android:id="@+id/frameTitle"
        android:padding="5dp"
        android:layout_height="wrap_content"
        android:layout_width="fill_parent"
        android:background="@drawable/title_bg">
            <fragment
              android:name="com.fragment.TitleFragment"
              android:id="@+id/fragmentTag"
              android:layout_width="fill_parent"
              android:layout_height="wrap_content" />

  </FrameLayout>

Ve böyle bir parça nesnesi ayarlıyorum

FragmentManager fragmentManager = activity.getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
Fragment newFragment = new FragmentType1();
fragmentTransaction.replace(R.id.frameTitle, casinodetailFragment, "fragmentTag");

// fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();

Farklı türde farklı Fragment nesneleri ( FragmentType2,FragmentType3,...) ayarlıyor . Şimdi bir noktada şu anda hangi nesnenin orada olduğunu tanımlamam gerekiyor.

Gelen kısa Böyle bir şey yapmanız gerekir:

Fragment currentFragment = //what is the way to get current fragment object in FrameLayout R.id.frameTitle

Aşağıdakileri denedim

TitleFragment titleFragmentById = (TitleFragment) fragmentManager.findFragmentById(R.id.frameTitle);

ve

    TitleFragment titleFragmentByTag = (TitleFragment) fragmentManager.findFragmentByTag("fragmentTag");

Ama her iki nesne de (titleFragmentById ve titleFragmentByTag)null
Bir şey mi kaçırdım?
İçin kullanıyorum Compatibility Package, r3ve geliştiriyorum API level 7.

findFragmentById()ve veya öğesini findFragmentByTag()kullanarak bir parça ayarladıysak çalışacaktır , ancak nesneyi xml olarak ayarlamışsak çalışacaktır (benim yaptığım gibi ). Bence XML dosyalarımda bir şey eksik.fragmentTransaction.replacefragmentTransaction.addreturn nullmain.xml



@CommonsWare yanıtı size yardımcı oluyor mu?
IntoTheDeep

Yanıtlar:


253

Şimdi bir noktada şu anda hangi nesnenin orada olduğunu tanımlamam gerekiyor

Çağrı findFragmentById()üzerine FragmentManagerve içinde olan parça tespit R.id.frameTitlekap.


1
Yanıtınız için teşekkürler. fragmentTransaction.replacE veya kullanarak bir parça ayarladıysak çalışacak, fragmentTransaction.addancak xml olarak ayarlamışsak alamayacak. Düzenlememi gör 2
Labeeb Panampullan

9
@Labeeb P: Düzen kaynaklarında bildirilen parçaları değiştiremezsiniz.
CommonsWare

Şu anda görünür sekmeyi / parçayı tutmak için bir sınıf oluşturmak da işe yarayacak, ben sadece denedim. Umarım başarısız olmaz.
Skynet

@CommonsW Tabs findFragmentByTagdurumunda null döndürüyor ActionBar. Benim Activityuzanan hangi ActionBarActivityilk sekmeler eklemek ActionBarve sonra bulmak!
Muhammed Babar

1
@MuhammadBabar: Deneyebilirsin executePendingTransactions()üzerinde FragmentManagerçağırdıktan sonra commit()bu denemedim bile, işlem üzerinde. Veya etiketi setContentView()olan bir düzen dosyası kullanmak için kullanabilirsiniz <fragment>. Bunlardan herhangi biri eşzamanlı olarak gerçekleşir ve böylece parça, kullandığınız onCreate()aramanın içinde executePendingTransaction()veya olur setContentView(). Aksi takdirde, sıradan bir FragmentTransactioneşzamansız olarak işlenir ve zaman onCreate()bitiminde bile başlamaz .
CommonsWare

110

Bunu dene,

Fragment currentFragment = getActivity().getFragmentManager().findFragmentById(R.id.fragment_container);

bu u geçerli parçayı verecektir, o zaman onu parça sınıfıyla karşılaştırabilir ve eşyalarınızı yapabilirsiniz.

    if (currentFragment instanceof NameOfYourFragmentClass) {
     Log.v(TAG, "find the current fragment");
  }

Bu satırı nereye koyacaksınız?
Anand Savjani

9
Bazen getSupportFragmentManager()bunun yerine kullanmak zorunda support
Muz

"KOKU SINIFI'NIN ADI" etrafında tırnak kaldırın.
Alan Nelson

37

OnAttachFragment olayı kullanabilirsiniz hangi parçası etkin yakalamak için yararlı olabilir düşünüyorum.

@Override
public void onAttachFragment(Fragment fragment) {
    // TODO Auto-generated method stub
    super.onAttachFragment(fragment);

    Toast.makeText(getApplicationContext(), String.valueOf(fragment.getId()), Toast.LENGTH_SHORT).show();

}

3
hangi parçayı bağlı olduğumu elde edebiliyorum. Yaptığım şey yönünü değiştirdiğimde, aynı görünümü başka bir görünümde göstermem gerekiyor, bu yüzden bunu nasıl yapacağım.
Androi Developer

7
Geri gittiğinizde etkin parçayı güncellemediğinden bu çalışmaz.
Justin

1
@Justin bu yüzden onDetach'ı da zayıf bir referans listesi ile kullanmamız gerekiyor
letroll

12

Bence yapmalısın:

Fragment currentFragment = fragmentManager.findFragmentByTag("fragmentTag");

Bunun nedeni, "fragmentTag" etiketini eklediğiniz son parçaya (replace adını verdiğinizde) ayarlamanızdır.


Teşekkürler düzelttim. Bu soruyu yazarken yazım hatası. fragmentTransaction.replacE veya kullanarak bir parça ayarladıysak çalışacak, fragmentTransaction.addancak xml olarak ayarlamışsak alamayacak. Düzenlememi gör 2
Labeeb Panampullan

Çok teşekkür ederim! Sorunumu çözdü!
Jonas Gröger

2
bu çözüm birden fazla parça için aynı etiketi koymanız gerektiği anlamına gelmiyor mu? aksi halde fragmentTagmevcut parçanın etiketinin nasıl olduğunu bilirsiniz ?
Haziran'da Thupten

12

Parçaların listesini alabilir ve sonuncusuna bakabilirsiniz.

    FragmentManager fm = getSupportFragmentManager();
    List<Fragment> fragments = fm.getFragments();
    Fragment lastFragment = fragments.get(fragments.size() - 1);

Ancak bazen (geri gittiğinizde) liste boyutu aynı kalır ancak son öğelerin bazıları boştur. Bu yüzden listede boş olmayan son parçayı yineledim ve kullandım.

    FragmentManager fm = getSupportFragmentManager();
    if (fm != null) {
        List<Fragment> fragments = fm.getFragments();
        if (fragments != null) {
            for(int i = fragments.size() - 1; i >= 0; i--){
                Fragment fragment = fragments.get(i);
                if(fragment != null) {
                    // found the current fragment

                    // if you want to check for specific fragment class
                    if(fragment instanceof YourFragmentClass) {
                        // do something
                    }
                    break;
                }
            }
        }
    }

3
getFragments()Yöntemi kullanmayın . İle işaretlenmiştir @hideve destek kitaplığı kavanozuna dahil edilmesi beklenmemektedir. Dışa aktarılan API'nın bir parçası olarak düşünülmemelidir.
James Wald

Heh, o zaman tam olarak ne yapmanıza izin veren bir yöntem yaratmış olmalılar getFragments(), çünkü oldukça sık ihtiyacınız var. Sanırım şimdi de halka açık.
EpicPandaForce

10

Bu benim için en basit çözüm ve iş.

1.) parçanızı eklersiniz

ft.replace(R.id.container_layout, fragment_name, "fragment_tag").commit();

2.)

FragmentManager fragmentManager = getSupportFragmentManager();

Fragment currentFragment = fragmentManager.findFragmentById(R.id.container_layout);

if(currentFragment.getTag().equals("fragment_tag"))

{

 //Do something

}

else

{

//Do something

}

9

Geç olabilir ama umarım başka birine yardımcı olur, ayrıca @CommonsWare doğru cevabı gönderdi.

FragmentManager fm = getSupportFragmentManager();
Fragment fragment_byID = fm.findFragmentById(R.id.fragment_id);
//OR
Fragment fragment_byTag = fm.findFragmentByTag("fragment_tag");

9
Bu, kimliği veya etiketi mutlaka bilmediğiniz için etkin parçayı almanıza izin vermez.
Justin

7

Belki de en basit yol:

public MyFragment getVisibleFragment(){
    FragmentManager fragmentManager = MainActivity.this.getSupportFragmentManager();
    List<Fragment> fragments = fragmentManager.getFragments();
    for(Fragment fragment : fragments){
        if(fragment != null && fragment.getUserVisibleHint())
            return (MyFragment)fragment;
    }
    return null;
}

Benim için çalıştı


6

Ana Etkinlik Sınıfınızda alan oluşturabilirsiniz:

public class MainActivity extends AppCompatActivity {

    public Fragment fr;

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

}

Ve sonra her parça sınıfının içinde:

public class SomeFragment extends Fragment {

@Override
    public View onCreateView(LayoutInflater inflater,
                             ViewGroup container, Bundle savedInstanceState) {

        ((MainActivity) getActivity()).fr = this;
}

'Fr' alanınız şu andaki parça Nesne

PopBackStack () ile de çalışıyor


4

Bir süredir olduđunu biliyorum, ama birisine yardým etmesi ihtimaline karţý burada olacađým.

Doğru cevap farkla (ve seçilmiş bir) CommonsWare itibaren bir. Gönderilenle aynı sorunu yaşıyordum, aşağıdaki

MyFragmentClass fragmentList = 
            (MyFragmentClass) getSupportFragmentManager().findFragmentById(R.id.fragementID);

null döndürmeye devam etti. Benim hatam xml dosyamda gerçekten saçma oldu:

<fragment
    android:tag="@+id/fragementID"
    android:name="com.sf.lidgit_android.content.MyFragmentClass"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
/>

Hata android vardı : tag INSTEAD OF android: id .


2

@Hammer yanıtı benim için çalıştı, ben yüzen bir eylem düğmesini kontrol etmek

final FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
    fab.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(final View view) {
            android.app.Fragment currentFragment = getFragmentManager().findFragmentById(R.id.content_frame);
            Log.d("VIE",String.valueOf(currentFragment));
            if (currentFragment instanceof PerfilFragment) {
                PerfilEdit(view, fab);
            }
        }
});

2

AbstractActivity'den genişliyorsanız getFragments () yöntemini kullanabilirsiniz:

for (Fragment f : getFragments()) {
    if (f instanceof YourClass) {
        // do stuff here
    }
}

1

Etkinliğin XML düzeninde parçayı tanımlıyorsanız, Activityaramadan setContentView()önce aradığınızdan emin olun findFragmentById().


1

BackStack kullanıyorsanız ... ve SADECE arka yığını kullanıyorsanız, şunu deneyin:

rivate Fragment returnToPreviousFragment() {

    FragmentManager fm = getSupportFragmentManager();

    Fragment topFrag = null;

    int idx = fm.getBackStackEntryCount();
    if (idx > 1) {
        BackStackEntry entry = fm.getBackStackEntryAt(idx - 2);
        topFrag = fm.findFragmentByTag(entry.getName());
    }

    fm.popBackStack();

    return topFrag;
}

0

Bu size mevcut parça sınıfı adını verecektir ->

String fr_name = getSupportFragmentManager().findFragmentById(R.id.fragment_container).getClass().getSimpleName();

0
  1. OnStart yönteminde bir kontrol yapın (aktivite kabında hangi parçayı);

    @Override
    protected void onStart() {
    super.onStart();
    Fragment fragmentCurrent = getSupportFragmentManager.findFragmentById(R.id.constraintLayout___activity_main___container);
    }
  2. Bazı kontroller:

    if (fragmentCurrent instanceof MenuFragment) 
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.