বর্তমান টুকরা অবজেক্টটি পান


175

আমার মধ্যে main.xmlআছে

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

এবং আমি খণ্ডন অবজেক্টটি এর মতো সেট করছি

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

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

এটি FragmentType2,FragmentType3,...বিভিন্ন সময়ে বিভিন্ন ধরণের ফ্রেগমেন্ট অবজেক্ট ( ) সেট করে দিচ্ছে । এখন কিছু সময় আমার চিহ্নিত করা প্রয়োজন বর্তমানে কোন বস্তুটি রয়েছে।

ইন সংক্ষিপ্ত আমি ভালো কিছু করতে হবে:

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

আমি নিম্নলিখিত চেষ্টা করেছিলাম

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

এবং

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

তবে উভয় বস্তু (শিরোনামফ্রেগমেন্টবিআইআইডি এবং শিরোনামফ্রেগমেন্টবিটাইগ)null
আমি কি কিছু মিস করেছি?
আমি ব্যবহার করছি Compatibility Package, r3এবং এর জন্য বিকাশ করছি API level 7

findFragmentById()এবং findFragmentByTag()যদি আমরা ব্যবহার করে টুকরো সেট করে থাকি fragmentTransaction.replaceবা কাজ fragmentTransaction.addকরব return nullতবে আমরা যদি xML এ অবজেক্টটি সেট করে থাকি (যেমন আমি আমার মধ্যে যা করেছি main.xml)। আমি মনে করি আমার এক্সএমএল ফাইলগুলিতে আমি কিছু মিস করছি।



@ কমন্সওয়্যার উত্তরগুলি কি আপনাকে সাহায্য করে, কারণ আমি এখনও শূন্য?
দীপ

উত্তর:


253

এখন কিছু সময় আমার চিহ্নিত করা প্রয়োজন বর্তমানে কোন বস্তুটি রয়েছে

কল findFragmentById()করুন FragmentManagerএবং আপনার ধারকটিতে কোন টুকরা রয়েছে তা নির্ধারণ করুন R.id.frameTitle


1
আপনার প্রতিক্রিয়ার জন্য ধন্যবাদ. যদি আমরা fragmentTransaction.replacই ব্যবহার করে টুকরো সেট করে থাকি তবে এটি কার্যকর হবে তবে আমরা fragmentTransaction.addযদি এটি এক্সএমএল সেট করে রেখেছি তবে তা পাবেন না। আমার সম্পাদনা 2 দেখুন
লবিব পানামপুল্লান

9
@ লাবিব পি: আপনি লেআউট রিসোর্সে ঘোষিত টুকরোগুলি পরিবর্তন করতে পারবেন না।
কমন্সওয়্যার

বর্তমানে দৃশ্যমান ট্যাব / টুকরাটি ধরে রাখতে একটি শ্রেণি তৈরি করাও কাজ করবে, আমি এটিকে বিচার করার চেষ্টা করেছি। আশা করি কোনও ব্যর্থতা নেই।
স্কাইনেট

ট্যাবগুলির findFragmentByTagক্ষেত্রে @ কমন্সওয়্যার পুনরায় ফিরে যাচ্ছে ActionBar। আমার মধ্যে Activityযা প্রসারিত হচ্ছে ActionBarActivityআমি প্রথমে ট্যাবগুলি যুক্ত করছি ActionBarএবং তারপরে এটি সন্ধান করছি!
মুহাম্মদ বাবর

1
@ মুহম্মদবাবার: লেনদেনের বিষয়ে ফোন executePendingTransactions()করার FragmentManagerপরে আপনি চেষ্টা করতে পারেন commit(), যদিও আমি এটি চেষ্টা করি নি। অথবা আপনি setContentView()একটি <fragment>ট্যাগ সহ একটি বিন্যাস ফাইল ব্যবহার করতে পারেন । করেন, এগুলি সিঙ্ক্রোনাস ঘটতে, এবং তাই টুকরা মধ্যে বিদ্যমান থাকবে onCreate()কল নিজেই যেখানে আপনি ব্যবহৃত executePendingTransaction()বা setContentView()। অন্যথায়, একটি সাধারণ FragmentTransactionতাত্পর্যপূর্ণভাবে প্রক্রিয়াজাত হয়, এবং এটি সময় onCreate()শেষ হওয়ার পরেও শুরু হবে না ।
কমন্সওয়্যার

110

এটা চেষ্টা কর,

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

এটি আপনাকে বর্তমান খণ্ডটি দেবে, তারপরে আপনি এটিকে খণ্ড শ্রেণীর সাথে তুলনা করতে এবং আপনার স্টাফগুলি করতে পারেন।

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

এই লাইনটি কোথায় রাখব?
আনন্দ সাবজানি

9
কখনও কখনও getSupportFragmentManager()পরিবর্তে আপনাকে ব্যবহার করতে হবে, এবং supportঅংশটি ছাড়াই শূন্য হয়ে যাবে
Muz

"আপনার বাগানের ক্লাসের নাম" কাছাকাছি থেকে উদ্ধৃতিগুলি সরান।
অ্যালান নেলসন

37

আমি মনে করি আপনি অ্যাটাকফ্রেগমেন্ট ইভেন্টটি ব্যবহার করতে পারবেন কোন খণ্ডটি সক্রিয় তা ধরতে কার্যকর হতে পারে।

@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
আমি কোন টুকরাটি সংযুক্ত করেছি তা পেতে পারি। আমার চিন্তাভাবনাটি হ'ল আমি যখন ওরিয়েন্টেশনটি পরিবর্তন করি তখন আমার একই ভিউটি অন্য কোনও ভিউয়ের মতো প্রদর্শন করা উচিত না যাতে এটি কীভাবে করা যায়।
Androi বিকাশকারী

7
এটি কাজ করে না কারণ আপনি ফিরে গেলে এটি সক্রিয় খণ্ডকে আপডেট করে না।
জাস্টিন

1
@Justin তাই আমরা শুধু একটি weakreference তালিকা সঙ্গে এছাড়াও onDetach ব্যবহার করতে হবে
letroll

12

আমার মনে হয় আপনার করা উচিত:

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

কারণটি হ'ল আপনি যুক্ত করা শেষ টুকরোটিতে "ফ্রেগমেন্টট্যাগ" ট্যাগটি সেট করেছেন (যখন আপনি রিপ্লেস ডাকবেন)।


ধন্যবাদ আমি এটি সংশোধন করেছি। এই প্রশ্নটি লেখার সময় এটি একটি টাইপ ভুল। যদি আমরা fragmentTransaction.replacই ব্যবহার করে টুকরো সেট করে থাকি তবে এটি কার্যকর হবে তবে আমরা fragmentTransaction.addযদি এটি এক্সএমএল সেট করে রেখেছি তবে তা পাবেন না। আমার সম্পাদনা 2 দেখুন
লবিব পানামপুল্লান

তোমাকে অনেক ধন্যবাদ! আমার সমস্যা সমাধান!
জোনাস গ্রেজার

2
এই সমাধানটির অর্থ এই নয় যে আপনি একাধিক টুকরা জন্য একই ট্যাগ রাখতে হবে? অন্যথায় আপনি কীভাবে জানবেন fragmentTagযে বর্তমান খণ্ডটির জন্য ট্যাগটি রয়েছে?
Thupten

12

আপনি খণ্ডগুলির তালিকা পেতে পারেন এবং শেষটির দিকে সন্ধান করতে পারেন।

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

তবে কখনও কখনও (যখন আপনি আবার নেভিগেট করেন) তালিকার আকার একই থাকে তবে শেষের কয়েকটি উপাদান শূন্য থাকে। সুতরাং তালিকায় আমি সর্বশেষটি শূন্য নয় খণ্ডে পুনরাবৃত্তি করেছি এবং এটি ব্যবহার করেছি।

    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()পদ্ধতিটি ব্যবহার করবেন না । এটি চিহ্নযুক্ত @hideএবং সমর্থন লাইব্রেরি জারের সাথে অন্তর্ভুক্ত থাকার কথা নয়। এটিকে রফতানি করা API এর অংশ হিসাবে বিবেচনা করা উচিত নয়।
জেমস ওয়াল্ড

হেই, তাহলে তাদের এমন একটি পদ্ধতি তৈরি করা উচিত যা আপনাকে যা করতে ঠিক তা করতে getFragments()দেয়, কারণ আপনার প্রায়শই এটি প্রয়োজন। আমি মনে করি এটি এখন প্রকাশ্যেও পাওয়া যায়।
এপিকপান্ডাফোরস

10

এটি আমার পক্ষে সহজ সমাধান এবং কাজ।

1.) আপনি আপনার টুকরা যোগ করুন

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

এটি দেরিতে হতে পারে তবে আমি আশা করি এটি অন্য কাউকে সাহায্য করবে, এছাড়াও @ কমন্সওয়্যার সঠিক উত্তরটি পোস্ট করেছে।

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

9
এটি আপনাকে সক্রিয় টুকরো পেতে অনুমতি দেয় না, যেহেতু আপনি অগত্যা আইডি বা ট্যাগটি জানেন না।
জাস্টিন

7

সবচেয়ে সহজ উপায় হ'ল:

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

এটা আমার জন্য কাজ করেছে


6

আপনি আপনার পিতামাতার ক্রিয়াকলাপ শ্রেণিতে ক্ষেত্র তৈরি করতে পারেন:

public class MainActivity extends AppCompatActivity {

    public Fragment fr;

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

}

এবং তারপরে প্রতিটি খণ্ড শ্রেণীর ভিতরে:

public class SomeFragment extends Fragment {

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

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

আপনার 'ফ্র' ক্ষেত্রটি বর্তমান খণ্ড অবজেক্ট

এটি পপব্যাকস্ট্যাকের সাথেও কাজ করছে ()


4

আমি জানি এটি কিছুক্ষণ হয়ে গেছে, তবে এটি যদি কাউকে সাহায্য করে তবে আমি এখানে এটি করব।

সঠিক উত্তর দ্বারা পর্যন্ত (এবং এক নির্বাচিত) CommonsWare থেকে এক। আমি পোস্ট হিসাবে একই সমস্যা ছিল, নিম্নলিখিত

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

নাল ফিরতে রাখা আমার এক্সএমএল ফাইলটিতে আমার ভুলটি সত্যিই নির্বোধ ছিল:

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

ভুলটি ছিল যে আমার অ্যান্ড্রয়েড ছিল : ট্যাগ ইনস্টল করুন অ্যান্ড্রয়েড: আইডি


2

@ হ্যামার প্রতিক্রিয়া আমার পক্ষে কাজ করেছে, আমি একটি ভাসমান অ্যাকশন বোতামটি নিয়ন্ত্রণ করতে ব্যবহার করছি

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

আপনি যদি অ্যাবস্ট্রাক্ট অ্যাক্টিভিটি থেকে প্রসারিত করেন তবে আপনি getFrations () পদ্ধতিটি ব্যবহার করতে পারেন:

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

1

আপনি যদি ক্রিয়াকলাপের এক্সএমএল লেআরটিতে খণ্ডটি সংজ্ঞায়িত করে থাকেন তবে Activityকল setContentView()করার আগে আপনি অবশ্যই কল করবেন তা নিশ্চিত করুন findFragmentById()


1

আপনি যদি ব্যাকস্ট্যাকটি ব্যবহার করেন ... এবং কেবল আপনি যদি পিছনের স্ট্যাকটি ব্যবহার করছেন তবে এটি চেষ্টা করুন:

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

এটি আপনাকে বর্তমান খণ্ড শ্রেণীর নাম -> দেবে

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

0
  1. অন ​​স্টার্ট পদ্ধতিতে একটি চেক (ক্রিয়াকলাপের পাত্রে কোনও টুকরো টুকরো) করুন;

    @Override
    protected void onStart() {
    super.onStart();
    Fragment fragmentCurrent = getSupportFragmentManager.findFragmentById(R.id.constraintLayout___activity_main___container);
    }
  2. কিছু পরীক্ষা করুন:

    if (fragmentCurrent instanceof MenuFragment) 
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.