Soru Farklı içerikli sekmelere sahip olmak için FragmentPagerAdapter'i nasıl kullanırım?


Android marketinde olduğu gibi hızlıca kaydırabileceğiniz farklı sekmelere sahip olmak istiyorum. Her sekme bir parça kullanmalı ve bunun için bir yöntem kullanmalıdır.

Bu benim FragmentPagerAdapter sınıfım:

public class SectionsPagerAdapter extends FragmentPagerAdapter {

    public SectionsPagerAdapter(FragmentManager fm) {
        super(fm);  
    }

    @Override
    public Fragment getItem(int position) {
        Fragment fragment =null;
        switch (position) {
            case 0:
                fragment = new ConnectionFragment();
                break;
            case 1:
                fragment = new DataFragment();
                break;              
            case 2:
                fragment = new GraphFragment();
                break;          }
        return fragment;    
    }
    @Override
    public int getCount() {
        // Show 3 total pages.
        return 3;
    }
}

Ve her fragman türü / sekmesi için üç sınıfım var:

public static class ConnectionFragment extends Fragment {
    public static final String ARG_SECTION_NUMBER = "section_number";
    public String stringConnectionStatus = "Offline";
    public String stringWiflyIp = "0.0.0.0";

    public ConnectionFragment() {}

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View connectionView = inflater.inflate(R.layout.fragment_connection,
                container, false);
        TextView statusView = (TextView) connectionView.findViewById(R.id.status_label);
        statusView.setText("Connection status: " + stringConnectionStatus);
        TextView ipView = (TextView) connectionView.findViewById(R.id.ip_label);
        ipView.setText("WiFly IP: " + stringWiflyIp);
        /**TextView sectionBarView = (TextView) connectionView
                .findViewById(R.id.section_label);
        sectionBarView.setText("pups");"*/

        return connectionView;
    }
}

public static class DataFragment extends Fragment {

    public DataFragment() {}

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View dataView = inflater.inflate(R.layout.fragment_data,
                container, false);
        TextView sectionBarView = (TextView) dataView
                .findViewById(R.id.section_label);
        sectionBarView.setText("pups2");
        return dataView;
    }
}

public static class GraphFragment extends Fragment {

    public GraphFragment() {
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_graph,
                container, false);
        TextView sectionBarView = (TextView) rootView
                .findViewById(R.id.section_label);
        sectionBarView.setText("pups3");
        return rootView;
    }
}

Her Fragman özelleştirilebilir olmalı, bu yüzden üç sınıfa sahibim.

Yine de, uygulama, getItem yönteminde çöküyor. Herhangi bir fikir? Teşekkür ederim!

Düzenleme: Tam MainActivity.java:

import ...
public class MainActivity extends FragmentActivity {

    /**
     * The {@link android.support.v4.view.PagerAdapter} that will provide
     * fragments for each of the sections. We use a
     * {@link android.support.v4.app.FragmentPagerAdapter} derivative, which
     * will keep every loaded fragment in memory. If this becomes too memory
     * intensive, it may be best to switch to a
     * {@link android.support.v4.app.FragmentStatePagerAdapter}.
     */
    SectionsPagerAdapter mSectionsPagerAdapter;
    public List<String> fragments = new Vector<String>();

    /**
     * The {@link ViewPager} that will host the section contents.
     */
    ViewPager mViewPager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // Create the adapter that will return a fragment for each of the three
        // primary sections of the app.
        mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());

        // Set up the ViewPager with the sections adapter.
        mViewPager = (ViewPager) findViewById(R.id.pager); //pager
        mViewPager.setAdapter(mSectionsPagerAdapter);


    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    /**
     * A {@link FragmentPagerAdapter} that returns a fragment corresponding to
     * one of the sections/tabs/pages.
     */


    public class SectionsPagerAdapter extends FragmentPagerAdapter {


        public SectionsPagerAdapter(FragmentManager fm) {
            super(fm);
            fragments.add(ConnectionFragment.class.getName());
            fragments.add(DataFragment.class.getName());
            fragments.add(GraphFragment.class.getName());
            //fragmentsA = "fragments";

        }

        @Override
        public Fragment getItem(int position) {
            // getItem is called to instantiate the fragment for the given page.
            // Return a DummySectionFragment (defined as a static inner class
            // below) with the page number as its lone argument.
            /*Fragment fragment =null;
            switch (position) {
                case 0:
                    fragment = new ConnectionFragment();
                    break;
                case 1:
                    fragment = new DataFragment();
                    break;              
                case 2:
                    fragment = new GraphFragment();
                    break;          }
            return fragment;*/
            return Fragment.instantiate(getBaseContext(), fragments.get(position));

        }
        @Override
        public int getCount() {
            // Show 3 total pages.
            return 3;
        }

        @Override
        public CharSequence getPageTitle(int position) {
            Locale l = Locale.getDefault();
            switch (position) {
            case 0:
                return getString(R.string.title_section1).toUpperCase(l);
            case 1:
                return getString(R.string.title_section2).toUpperCase(l);
            case 2:
                return getString(R.string.title_section3).toUpperCase(l);
            }
            return null;
        }
    }


    /**
     * A dummy fragment representing a section of the app, but that simply
     * displays dummy text.
     */
    public static class ConnectionFragment extends Fragment {
        /**
         * The fragment argument representing the section number for this
         * fragment.
         */
        public static final String ARG_SECTION_NUMBER = "section_number";
        public String stringConnectionStatus = "Offline";
        public String stringWiflyIp = "0.0.0.0";

        public ConnectionFragment() {}

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
            View connectionView = inflater.inflate(R.layout.fragment_connection,container, false);
            TextView statusView = (TextView) connectionView.findViewById(R.id.status_label);
            statusView.setText("Connection status: " + stringConnectionStatus);
            TextView ipView = (TextView) connectionView.findViewById(R.id.ip_label);
            ipView.setText("WiFly IP: " + stringWiflyIp);
            /**TextView sectionBarView = (TextView) connectionView
                    .findViewById(R.id.section_label);
            sectionBarView.setText("pups");"*/

            return connectionView;
        }
    }
    public static class DataFragment extends Fragment {

        public DataFragment() {}

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
            View dataView = inflater.inflate(R.layout.fragment_data,
                    container, false);
            //TextView sectionBarView = (TextView) dataView.findViewById(R.id.section_label);
            //sectionBarView.setText("pups2");
            return dataView;
        }
    }
    public static class GraphFragment extends Fragment {

        public GraphFragment() {}

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
            View rootView = inflater.inflate(R.layout.fragment_graph,
                    container, false);
            //TextView sectionBarView = (TextView) rootView.findViewById(R.id.section_label);
            //sectionBarView.setText("pups3");
            return rootView;
        }
    }
}

18
2018-04-22 14:35


Menşei


Logcat hatasını ve tam olarak hangi satırın hata yaptığını yayınlayabilir misiniz? - ianhanniballake
aşağıdaki cevaba yorum yapın - timolemow


Cevaplar:


Bağdaştırıcıyı oluştur:

class MyPagerAdapter extends FragmentPagerAdapter {
        public List<String> fragmentsA; 

        public MyPagerAdapter(FragmentManager fm) {
            super(fm);
            fragmentsA = fragments;
        }

        @Override
        public Fragment getItem(int position) {
            //return MyFragment.newInstance();
            return Fragment.instantiate(context, fragmentsA.get(position));

        }

        @Override
        public CharSequence getPageTitle(int position) {
            //return CONTENT[position % CONTENT.length].toUpperCase();
            return mEntries.get(position % CONTENT.length).toUpperCase();
        }

        @Override
        public int getCount() {
           // return CONTENT.length;
            return mEntries.size();
        }

        @Override
        public int getItemPosition(Object object) {
            return POSITION_NONE;
        }
    }

Her parça farklı sınıflara aittir.

Yani bir parça listesi tanımlamanız gerekir (Bunlar ana FragmentActivity'ye gider):

static MyPagerAdapter adapter;

ve parçaları ile doldurun:

fragments.add(ConnectionFragment.class.getName());
fragments.add(DataFragment.class.getName());
fragments.add(Tab3.class.getName());
//..etc

Daha sonra parçaları bu adaptöre eklemelisiniz:

 pager = (ViewPager)findViewById(R.id.viewpager);
 adapter = new MyPagerAdapter(getSupportFragmentManager());
 pager.setAdapter(adapter);

MyPagerAdaper, içerdiği tüm parçalar üzerinden geçecektir. fragments Liste, sonra her birini başlatacak.


15
2018-04-22 14:43



Hızlı cevap için teşekkürler. Tekliflerinizi uyguladık ve bu, şimdi logcat'ın bana verdiği şey: - timolemow
04-22 18: 15: 32.964: E / AndroidRuntime (7540): Nedeniyle: java.lang.NullPointerException 04-22 18: 15: 32.964: E / Android Çalışma Zamanı (7540): com.example.wiflytemp.MainActivity $ SectionsPagerAdapter <init> (MainActivity.java:70) 04-22 18: 15: 32.964: E / Android Çalışma Zamanı (7540): com.example.wiflytemp.MainActivity.onCreate (MainActivity.java:43) 04-22 18:15 : 32.964: E / AndroidRuntime (7540): android.app.Activity.performCreate'da (Activity.java:5104) - timolemow
04-22 18: 15: 32.964: E / Android Çalışması (7540): android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1080) 04-22 18: 15: 32.964: E / AndroidRuntime (7540): android. app.ActivityThread.performLaunchActivity (ActivityThread.java:2258) - timolemow
belirlenen satır hangisi? - Jani Bela
korumalı boşluk onCreate (Bundle savedInstanceState) {super.onCreate (savedInstanceState); setContentView (R.layout.activity_main); mSectionsPagerAdapter = new SectionsPagerAdapter (getSupportFragmentManager ()); // satır 43 mViewPager = (ViewPager) findViewById (R.id.pager); // çağrı cihazı mViewPager.setAdapter (mSectionsPagerAdapter); - timolemow


FragmentPagerAdapter # getItem yönteminizde Fragments'ın nesnesini oluşturmayın. Parçayı aşağıdaki şekilde iade etmeniz gerekiyor -

return Fragment.instantiate(context, ConnectionFragment.class.getName());

Bu, yöntemin böyle görüneceği anlamına gelir -

public class SectionsPagerAdapter extends FragmentPagerAdapter {

  public SectionsPagerAdapter(FragmentManager fm) {
    super(fm);  
  }

  @Override
  public Fragment getItem(int position) {
    Fragment fragment =null;
    switch (position) {
        case 0:
            fragment = Fragment.instantiate(context, ConnectionFragment.class.getName());
            break;
        case 1:
            fragment = Fragment.instantiate(context, DataFragment.class.getName());
            break;              
        case 2:
            fragment = Fragment.instantiate(context, GraphFragment.class.getName());
            break;          }
    return fragment;    
  }

  @Override
  public int getCount() {
    // Show 3 total pages.
    return 3;
  }
}

10
2018-04-22 20:28



Bu değişkeni "bağlam" a sahip değilim. Ne yapar ve bunu yaratmak zorunda mıyım? - timolemow
özel bağlam bağlamı; // global ve onCreate'da -> this.context = this; - Alexander Pfeif
Senin içinde Activity, bağlam this. - jaibatrik
Açıklamama izin ver . Eğer bağdaştırıcıyı aynı sınıfta oluşturursanız, o zaman YourClassName.this veya bunun yerine basitçe geçebilirsiniz. ancak sınıfın dışında bir adaptör oluşturduğunuzda. Bağdaştırıcıya bir başvuru göndermeniz gerekir; bu, bunun hangi etkinlikle ilişkilendirildiğini belirtir. Sonra bir Bağlam geçersiniz. Aksi takdirde sadece bunu kullanın. - Xar E Ahmer


Bu örneğe bakın:

 public static class MyPagerAdapter extends FragmentPagerAdapter {
    private static int NUM_ITEMS = 3;

    public MyPagerAdapter(FragmentManager fragmentManager) {
        super(fragmentManager);
    }

    // Returns total number of pages
    @Override
    public int getCount() {
        return NUM_ITEMS;
    }

    // Returns the fragment to display for that page
    @Override
    public Fragment getItem(int position) {
        switch (position) {
        case 0: // Fragment # 0 - This will show FirstFragment
            return FirstFragment.newInstance(0, "Page # 1");
        case 1: // Fragment # 0 - This will show FirstFragment different title
            return FirstFragment.newInstance(1, "Page # 2");
        case 2: // Fragment # 1 - This will show SecondFragment
            return SecondFragment.newInstance(2, "Page # 3");
        default:
            return null;
        }
    }

    // Returns the page title for the top indicator
    @Override
    public CharSequence getPageTitle(int position) {
        return "Page " + position;
    }        
}

0
2018-03-30 10:04