0

我正在处理本教程:http ://www.lucazanini.eu/2012/android/tabs-and-swipe-views/?lang=en 。问题是,如果我将选项卡的布局设置为一个简单的静态布局,就像这样(如教程那样),一切正常:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/tab1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center">

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:text="@string/body1" />

</LinearLayout>

但我需要标签是 ListFragment,问题是我的 ListFragment 什么也没显示。这是代码。不要绝望:我放了很多代码,但我认为您可能只需要查看 SongsFragment 和 SongsListAdapter 类(好吧,我不确定,因为我是它我不会在这里写,但是我想是因为有静态布局一切正常!)

编辑:我在示例中只发布了一个 listfragment,但似乎每个 listfragment 都有相同的问题

编辑:可能问题是我需要在选择选项卡时使用一种方法来显示片段

多谢

活动:

import android.app.ActionBar;
import android.app.ActionBar.Tab;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.support.v4.view.ViewPager;

public class PlayerActivity extends FragmentActivity implements
        ActionBar.TabListener {

    CollectionPagerAdapter mCollectionPagerAdapter;
    ViewPager mViewPager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        mCollectionPagerAdapter = new CollectionPagerAdapter(getSupportFragmentManager());

        final ActionBar actionBar = getActionBar();
        actionBar.setHomeButtonEnabled(false);
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

        mViewPager = (ViewPager) findViewById(R.id.pager);
        mViewPager.setAdapter(mCollectionPagerAdapter);
        mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
            @Override
            public void onPageSelected(int position) {
                // When swiping between different app sections, select
                // the corresponding tab.
                // We can also use ActionBar.Tab#select() to do this if
                // we have a reference to the Tab.
                actionBar.setSelectedNavigationItem(position);
            }
        });

        for (int i = 0; i < mCollectionPagerAdapter.getCount(); i++) {
            actionBar.addTab(actionBar.newTab()
                    .setText(mCollectionPagerAdapter.getPageTitle(i))
                    .setTabListener(this));
        }

    }

    public void onTabSelected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {
        mViewPager.setCurrentItem(tab.getPosition());
    }

    public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {
        // TODO Auto-generated method stub

    }

    public void onTabReselected(Tab tab, FragmentTransaction ft) {
        // TODO Auto-generated method stub

    }

}

歌曲片段

    import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.ListFragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ListView;

public class SongsFragment extends ListFragment {

import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.ListFragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ListView;

public class SongsFragment extends ListFragment {

    List<String[]> songs;

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
    }

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


    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);    

        songs = SongsDataSource.getInstance().getAllSongs();

        List<String[]> values = new ArrayList<String[]>();

        if (songs.size() == 0) {
            values.add(new String[] { "No files found", "Try to update your database", "" });
        }

        for (String[] song : songs) {
            values.add(new String[] { song[1], song[2], song[0] });
        }

        SongsListAdapter adapter = new SongsListAdapter(getActivity().getApplicationContext(),
                R.layout.songs, R.id.songsFragment_titleTextView,R.id.songsFragment_artistTextView, values);

        setListAdapter(adapter);

    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.songs, container, false); 
        return view;
    }



    @Override
    public void onListItemClick(ListView l, View v, int position, long id) {
    }

}

歌曲列表适配器

import java.util.List;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;



public class SongsListAdapter extends ArrayAdapter<List<String[]>> {
    private final Context context;
    private final List<String[]> values;
    private final Integer listViewId;
    private final Integer titleTextViewId;
    private final Integer artistTextViewId;

    public SongsListAdapter(Context context, Integer listViewId, Integer titleTextViewId, 
            Integer artistTextViewId, List values) {
        super(context, listViewId, values);
        this.context = context;
        this.listViewId = listViewId;
        this.values = values;
        this.titleTextViewId = titleTextViewId;
        this.artistTextViewId = artistTextViewId;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View rowView = inflater.inflate(listViewId, parent, false);
        TextView titleView = (TextView) rowView.findViewById(titleTextViewId);
        TextView artistView = (TextView) rowView.findViewById(artistTextViewId);
        titleView.setText(values.get(position)[0]);
        artistView.setText(values.get(position)[1]);
        return rowView;
    }
}

寻呼机适配器

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;


public class CollectionPagerAdapter extends FragmentPagerAdapter {

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

    @Override
    public Fragment getItem(int i) {
        Fragment fragment = new TabFragment();
        Bundle args = new Bundle();
        args.putInt(TabFragment.ARG_OBJECT, i);
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public int getCount() {
        return MyApplication.getInstance().infoFragments.length;
    }

    @Override
    public CharSequence getPageTitle(int position) {
        String tabLabel = null;

        if(0 <= position && position < MyApplication.getInstance().infoFragments.length) {
            tabLabel = MyApplication.getInstance().infoFragments[position].getLabel();
        }

        return tabLabel;
    }
}

TabFragment 类:

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

/**
 * A fragment that launches other parts of the demo application.
 */
public class TabFragment extends Fragment {

    public static final String ARG_OBJECT = "object";

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

        Bundle args = getArguments();
        int position = args.getInt(ARG_OBJECT);

        int tabLayout = 0;

        if(0 <= position && position < MyApplication.getInstance().infoFragments.length) {
            tabLayout = MyApplication.getInstance().infoFragments[position].getLayout();
        }

        View rootView = inflater.inflate(tabLayout, container, false);

        return rootView;
    }
}

MyApplication 类

 import android.app.Application;

    public class MyApplication extends Application {

        //SIGLETON DECLARATION

        private static MyApplication mInstance = null;

        public static MyApplication getInstance() { 
            if (mInstance == null) {
              mInstance = new MyApplication();
            }
            return mInstance;
        }

        public static InfoFragment[] infoFragments = new InfoFragment[] {
                new InfoFragment("Songs", R.layout.songs)
        };

        public static class InfoFragment {
            private String label;
            private int layout;

            public InfoFragment(String label, int layout) {
                this.label = label;
                this.layout = layout;
            }

            public String getLabel() {
                return label;
            }

            public int getLayout() {
                return layout;
            }
        }

    }
4

1 回答 1

1

哦,看起来你从来没有真正SongsFragment在你的 getItem() 方法中返回你的。实际上,您似乎从未使用过它!

@Override
public Fragment getItem(int i) {
    Fragment fragment = new TabFragment();
    Bundle args = new Bundle();
    args.putInt(TabFragment.ARG_OBJECT, i);
    fragment.setArguments(args);
    return fragment;
}
于 2012-12-27T22:04:04.817 回答