অ্যান্ড্রয়েডে লুকানো খণ্ডগুলি দেখান


100

আমি অ্যাপ্লিকেশন বিকাশ করছি যার মধ্যে 2 টুকরা রয়েছে এবং আমি আমার প্রয়োজন অনুসারে লুকোচুরি প্রদর্শন করতে চাই। নিম্নলিখিত কোডটিতে আমার সমস্যার সহজ উদাহরণ রয়েছে। এই সাধারণ ফ্রেগমেন্ট্যাকটিভিটিতে 1 টি বোতাম এবং একটি তালিকাভুক্ত অংশ রয়েছে।

এই সাধারণ উদাহরণটি ত্রুটিহীন কাজ করে। তবে আমি শো লুকানোর খণ্ডে সন্তুষ্ট নই। যদি আপনি লেআউট.সেটভিজিবিলিটি (View.GONE) সরিয়ে থাকেন; কোড থেকে ft.hide (f); খণ্ড আড়াল করবে না। আসলে আমরা টুকরাটি লুকিয়ে রাখছি না আমরা ধারক গোপন করছি।

আমার প্রশ্ন হ'ল এই কি টুকরো টুকরো টুকরো টুকরো দেখানোর উপায়? তা না হলে দয়া করে পরীক্ষিত উদাহরণ দিয়ে ব্যাখ্যা করুন কীভাবে টুকরোগুলি কীভাবে আড়াল করবেন এবং প্রদর্শন করবেন কারণ প্রচুর লোক এই সমস্যার মুখোমুখি হচ্ছে।

 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
        }

আপনার ধারকটির দৃশ্যমানতা সেট করার দরকার কেন? এটি দৃশ্যমানতা সেট না করেই কাজ করা উচিত।
আন্দ্রেই চেরেনকো

ঠিক এটি কন্টেইনারের দৃশ্যমানতা ছাড়া কাজ করা উচিত তবে এটি কাজ করছে না। দয়া করে আমার সাথে সাধারণ কাজের উদাহরণ ভাগ করুন। তখন আমি জানতে পারি আমি কোথায় অনুপস্থিত।
abidkhan303

4
আমার অনুমান যে আপনি প্রতি বার খণ্ডের বিভিন্ন ঘটনা প্রদর্শন / আড়াল করার চেষ্টা করছেন। যখন আপনি আপনার খণ্ড যুক্ত করবেন (আমি কোডের এই টুকরোটি দেখি না) এটি ট্যাগ দিয়ে যুক্ত করুন এবং তারপরে এটি ট্যাগটি পুনরুদ্ধার করুন (পরিবর্তে এটিতে রেফারেন্স সঞ্চয় করার চেষ্টা করার পরিবর্তে)। আপনি হারাতে পারেন এটি হতে পারে।
আন্দ্রি চেরেনকো

উত্তর:


162

ধারকটির দৃশ্যমান পতাকাগুলি নিয়ে গণ্ডগোল করবেন না - ফ্রেগমেন্টট্রান্সসিটি হাইড / শো আপনার জন্য অভ্যন্তরীণভাবে তা করে।

সুতরাং এটি করার সঠিক উপায় হ'ল:

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

বা যদি আপনি android.support.v4.app.Fraament ব্যবহার করছেন

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

4
আপনি সরাসরি পতাকাগুলির সাথে গণ্ডগোলের বিরুদ্ধে সুপারিশ করেন কেন? (আমি আপনার প্রস্তাবকে বিতর্ক করছি না, কেবল এটি বোঝার চেষ্টা করছি))
এলেন স্পার্টাস

4
হ্যাঁ, আমি এটি আপনার মূল বার্তায় পড়েছি। আমি আশা করছিলাম যে আপনি অতিরিক্ত ওভারহেডের পক্ষে যুক্তি যুক্ত করতে পারেন। এরই মধ্যে, আমি কিছু আবিষ্কার করেছি, যেমন পিছনের স্ট্যাকটিতে যুক্ত করার বিকল্প।
এলেন স্পার্টাস

4
এটি ত্রুটিযুক্ত প্রবণ কারণ আপনি নিম্ন স্তরের এপিআই এবং উচ্চ স্তরের এপিআইতে আপনার পতাকাগুলি পরিবর্তন করতে পারেন এবং আপনি যদি সতর্ক না হন (যেমন পতাকাগুলি সিঙ্ক থেকে বেরিয়ে আসে) আপনি অদ্ভুত বাগগুলি তাড়া করতে পারেন। এটি আপনার টুকরোগুলি লুকিয়ে রাখতে ও প্রদর্শন করতে ফ্রেগমেন্ট ম্যানেজার ব্যবহার করার পরামর্শ দেওয়া হচ্ছে।
নুমান সালাতি

@ নুনসালতী হাই, এর কোনও সামঞ্জস্যতা (সমর্থন লাইব্রেরি থেকে) আছে android.R.animator.fade_inএবং android.R.animator.fade_out?
সান্ত্বনা দিন

4
ধারকটির সাহায্যে আপনি এটি প্রদর্শন, লুকিয়ে রাখুন বা যানতে সেট করতে পারেন। কোনও খণ্ডটি গোপন করার সময় কোনও GONE বিকল্প নেই।
স্টিলথ রাব্বি

59

সংযোজন, আপনি একটি খণ্ডে করতে পারেন (উদাহরণস্বরূপ সার্ভার ডেটা পাওয়ার ক্ষেত্রে যখন):

 getView().setVisibility(View.GONE);

11
টুকরাটি অবজেক্টের শিশু এবং দেখুন না তাই কেউ কল করতে পারে না: ফ্রেগমেন্ট.সেটভিজিবিলিটি (View.INVISIBLE);
অ্যান্ড্রয়েডগীক

8
আরিয় অন্যরকম কিছু প্রস্তাব দিচ্ছে, সেই অংশটি থেকে ভিউটি পেতে এবং এর দৃশ্যমানতা নির্ধারণ করার পরামর্শ দিচ্ছে।
আলভারো সান্টেস্টেবন

10
এটি যখন আরম্ভ করা হয়নি তখনই যত্নবান getView()হতে পারে null
TWiStErRob

23

হাই আপনি এই পদ্ধতির ব্যবহার করে এটি করুন, সমস্ত খণ্ডগুলি একবার প্রাথমিকভাবে যুক্ত পাত্রে থাকবে এবং তারপরে আমরা কেবল পছন্দসই খণ্ডটি প্রকাশ করব এবং অন্যটিকে ধারকটির মধ্যে লুকিয়ে রাখছি।

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

আরও তথ্যের জন্য দয়া করে https://github.com/codepath/android_guides/wiki/Creating-and- ব্যবহার- বিভাগগুলি দেখুন। আমি আশা করি যে কাউকে সাহায্য করতে হবে। এমনকি যদি এটি একটি পুরানো প্রশ্ন।


4
সুতরাং আপনার কাছে ডিসপ্লেফ্রেগমেন্টবি () এবং ডিসপ্লেফ্রেগমেন্টসি () এর মতো আরও দুটি পদ্ধতি থাকতে হবে?
তেমিরবেক

হ্যাঁ @ টিমিরবেক আপনি ঠিক কীভাবে ডিসপ্লেফ্রেগমেন্টএ () পদ্ধতি প্রয়োগ করা যায় তা অনুসরণ করতে পারেন।
ম্যাঙ্গু 23

4
যদি আপনার একটি ক্রিয়াকলাপে (2 বা ততোধিক) অনেকগুলি অংশ থাকে এবং আপনি উপরের পদ্ধতিটি ব্যবহার করছেন তবে দয়া করে এটি ব্যবহার করুন । এটি লেখা এবং পড়া সহজ হবে।
ম্যাক্সিমাম ক্লড

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

4
সঠিক ft.setCustomAnimations (android.R.anim.fade_in, android.R.anim.fade_out);
ওয়েবভেরিজ

8

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

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

2

আমার কোড থেকে উপরের সমাধানটির সাথে তুলনা করে, সহজতম উপায় হ'ল লেআউটটিকে সংজ্ঞায়িত করা যাতে এতে খণ্ড থাকে, তারপরে আপনি লেআউট বৈশিষ্ট্যটি নিয়ন্ত্রণ করার মাধ্যমে ফ্রেমটিকে আড়াল বা আড়াল করতে পারেন যা সাধারণ দৃষ্টিকোণের সাথে সামঞ্জস্য হয়। এই ক্ষেত্রে কোনও অতিরিক্ত কোডের প্রয়োজন নেই এবং খণ্ডের অতিরিক্ত স্থাপনার বৈশিষ্ট্যগুলি বাইরের বিন্যাসে স্থানান্তরিত হতে পারে।

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

অনক্রিয়েটে, সেট কনটেন্টভিউয়ের পরে, আমি দুটি টুকরো লুকিয়ে রেখেছি এবং সেগুলি খণ্ড পরিচালকের কাছে প্রতিশ্রুতিবদ্ধ করেছি, তবে আমি প্রথম টুকরাটি হোম হিসাবে পরিবেশন করব না hide

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

রেফ: https://medium.com/@oluwabukunmi.aluko/bottom-navication-view-with-frations-a074bfd08711


1

আমি বেশ দেরিতে যেতে পারি তবে এটি ভবিষ্যতে কাউকে সহায়তা করতে পারে।
এই উত্তরটি করার জন্য একটি পরিবর্তন হয় mangu23 উত্তর
আমি শুধু এড়ানোর পুনরাবৃত্তি করতে লুপ জন্য একটি জুড়েছে এবং সহজে boilerplate কোড ছাড়া আরো টুকরা যোগ করতে।

আমাদের প্রথমে প্রদর্শিত টুকরাগুলির একটি তালিকা প্রয়োজন

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

তারপরে আমাদের এটি আমাদের টুকরো দিয়ে পূরণ করা দরকার

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

এবং তালিকা থেকে কোন খণ্ডটি নির্বাচিত হয়েছিল তা আমাদের জানার একটি উপায় প্রয়োজন, সুতরাং আমাদের getFragmentIndexফাংশন প্রয়োজন

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

এবং পরিশেষে, displayFragmentপদ্ধতিটি পছন্দ করবে:

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

এইভাবে, আমরা displayFragment(homeFragment)উদাহরণস্বরূপ কল করতে পারি ।
এটি স্বয়ংক্রিয়ভাবে প্রদর্শন করবে HomeFragmentএবং তালিকার অন্য কোনও খণ্ডটি আড়াল করবে ।
এই সমাধানটি আপনাকে পুরানো সংস্করণে স্টেটমেন্টগুলি fragmentListপুনরাবৃত্তি না করে আরও টুকরো টুকরো করার অনুমতি দেয় । আমি আশা করি যে কেউ এই দরকারী পাবেন।ifdisplayFragment


0

এটি আমার পক্ষে কাজ করেছে

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

এখানে দেওয়া উত্তরগুলি সঠিক এবং আমি পছন্দ করেছি @ জাইতে শোয়ের হুইফ আইডিয়াটি এবং প্রথম ভাগে খণ্ডটি বাস্তবায়ন করার উপায়টি বাদ দেওয়া ছাড়া এটি বর্তমানে প্রথম অংশে টুকরোটি লুকিয়ে রাখবে তাই আমি যুক্ত করলাম এতে সামান্য পরিবর্তন যুক্ত হ'ল আমি যুক্ত করলাম চেক এবং শো খণ্ডটি যদি এটি ইতিমধ্যে না হয়

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();
} 
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.