android - ViewPager 的奇怪行为

标签 android android-fragments android-viewpager pagerslidingtabstrip

我正在为我的 Android 应用程序使用 PagerSlidingTabStripMaterial Navigation Drawer图书馆。我正在观察 ViewPager 的奇怪行为 - 当我第一次打开它时,它工作正常,但我再次打开它时,ViewPager 是空的,因为没有适配器。

主要 Activity :

public class MainActivity extends AppCompatActivity {

    private Drawer drawer;
    private int lastSelection;
    private BroadcastReceiver mRegistrationBroadcastReceiver;

    private boolean isClickedByUser = false;

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

        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        drawer = new DrawerBuilder().withActivity(MainActivity.this)
                .withToolbar(toolbar).addDrawerItems(
                        new PrimaryDrawerItem().withName(R.string.name1)
                                .withIcon(R.drawable.icon1),
                        new PrimaryDrawerItem()
                                .withName(R.string.name2)
                                .withIcon(R.drawable.icon2))
                .withOnDrawerItemClickListener(
                        new Drawer.OnDrawerItemClickListener() {
                            @Override
                            public boolean onItemClick(AdapterView<?> adapterView, View view,
                                                       int position, long id,
                                                       IDrawerItem iDrawerItem) {
                                switch (position) {
                                    case 0:
                                        setTitle(R.string.title1);
                                        break;
                                    case 1:
                                        setTitle(R.string.title2);
                                        break;
                                }

                                FragmentManager fManager = getSupportFragmentManager();
                                FragmentTransaction transaction = fManager.beginTransaction();
                                transaction.replace(R.id.container, PlaceholderFragment.newInstance(
                                        position)).commitAllowingStateLoss();

                                lastSelection = position;
                                return false;
                            }
                        })
                .build();


        drawer.setSelection(0);
    }

    @Override
    public void onBackPressed() {
        if (drawer != null && drawer.isDrawerOpen()) {
            drawer.closeDrawer();
        } else {
            super.onBackPressed();
        }
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig){
        super.onConfigurationChanged(newConfig);
        drawer.setSelection(lastSelection);
    }

}

PlaceholderFragment,在那个ViewPager中完成:

public class PlaceholderFragment extends Fragment {

    private static final String ID = "id";

    private int id;

    public static PlaceholderFragment newInstance(int id) {
        PlaceholderFragment fragment = new PlaceholderFragment();
        Bundle args = new Bundle();
        args.putInt(ID, id);
        fragment.setArguments(args);
        return fragment;
    }

    public PlaceholderFragment() {
        // Required empty public constructor
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (getArguments() != null) {
            id = getArguments().getInt(ID);
        }
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View rootView = null;

        switch (id) {
            case 0:
                rootView = inflater.inflate(R.layout.view1, container, false);
                break;
            case 1:
                rootView = inflater.inflate(R.layout.tabs, container, false);

                ViewPager pager = (ViewPager) rootView.findViewById(R.id.viewPager);
                pager.setAdapter(new PagerAdapter(getActivity().getSupportFragmentManager()));

                PagerSlidingTabStrip tabs = (PagerSlidingTabStrip) rootView.findViewById(R.id.tabs);
                tabs.setViewPager(pager);
                tabs.setShouldExpand(true);
                tabs.setIndicatorColorResource(R.color.tab_indicator_color);
                tabs.setTextColorResource(R.color.tab_text_color);
                break;
            default:
                break;
        }

        return rootView;
    }

    private class PagerAdapter extends FragmentPagerAdapter {

        private int[] titlesResIds = { R.string.title1, R.string.title2 };

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

        @Override
        public CharSequence getPageTitle(int position) {
            return getString(titlesResIds[position]);
        }

        @Override
        public int getCount() {
            return titlesResIds.length;
        }

        @Override
        public Fragment getItem(int position) {
            return TabFragment.newInstance(position);
        }
    }

}

标签 fragment :

public class TabFragment extends ListFragment {

    private static final String ID = "id";
    private int id;

    public static TabFragment newInstance(int id) {
        TabFragment fragment = new TabFragment();
        Bundle args = new Bundle();
        args.putInt(ID, id);
        fragment.setArguments(args);
        return fragment;
    }

    public TabFragment() {
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (getArguments() != null) {
            id = getArguments().getInt(ID);
        }
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        AsyncTask<String, String, String> asyncTask = new AsyncTask<String, String, String>() {
            @Override
            protected String doInBackground(String... params) {
                OkHttpClient client = new OkHttpClient();

                Request request = new Request.Builder()
                        .url("http://host/")
                        .build();

                String result = null;
                try {
                    Response response = client.newCall(request).execute();
                    result = response.body().string();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                return result;
            }

            @Override
            protected void onPostExecute(String response) {
                super.onPostExecute(response);
                Gson gson = new Gson();
                JsonReader reader = new JsonReader(new StringReader(response));
                reader.setLenient(true);

                ArrayList<Message> messages = gson.fromJson(reader,
                        new TypeToken<ArrayList<Message>>(){}.getType());

                int i = messages.size() - 1;

                while (i != -1) {
                    if (messages.get(i).getType() != id)
                        messages.remove(i);

                    i--;
                }

                ArrayAdapter adapter = new MyListAdapter(messages);
                setListAdapter(adapter);
            }
        };

        asyncTask.execute();

        return inflater.inflate(R.layout.fragment, container, false);
    }

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

        Intent messageIntent = new Intent(getActivity(), MessageActivity.class);
        startActivity(messageIntent);
    }

    private class MyListAdapter extends ArrayAdapter {

        private Context context = getActivity();
        private ArrayList<Message> messages;

        public MyListAdapter(ArrayList<Message> messages) {
            super(getActivity(), R.layout.list_adapter);
            this.messages = messages;
        }

        @Override
        public int getCount() {
            return messages.size();
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            ViewHolder holder;

            if (convertView == null) {
                LayoutInflater inflater = LayoutInflater.from(context);
                convertView = inflater.inflate(R.layout.list_adapter, parent, false);

                holder = new ViewHolder();
                holder.imageIcon = (ImageView) convertView.findViewById(R.id.list_icon);
                holder.textDatetime = (TextView) convertView.findViewById(R.id.list_text_datetime);
                holder.textPrimary = (TextView) convertView.findViewById(R.id.list_text_primary);
                holder.textSecondary = (TextView) convertView.findViewById(R.id.list_text_secondary);

                convertView.setTag(holder);
            } else {
                holder = (ViewHolder) convertView.getTag();
            }

            Message message = messages.get(position);

            long timestamp = message.getTimestamp() * 1000;
            Date date = new Date(timestamp);
            String datetime = new SimpleDateFormat("dd.MM.yyyy hh:mm", Locale.US).format(date);

            holder.imageIcon.setImageResource(message.getIcon() == 0 ?
                    R.drawable.icon1 :
                    R.drawable.icon2);
            holder.textDatetime.setText(datetime);
            holder.textPrimary.setText(message.getTitle());
            holder.textSecondary.setText(message.getMessage());

            return convertView;
        }

        private class ViewHolder {
            ImageView imageIcon;
            TextView textDatetime;
            TextView textPrimary;
            TextView textSecondary;
        }
    }
}

最佳答案

我已经决定了我的问题。我在我的 PlaceholderFragment 中插入方法 getChildFragmentManager(),如这个答案 - How set ViewPager inside a Fragment .

关于android - ViewPager 的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31522158/

相关文章:

android - 如何将外部库项目添加到android studio 1.2.2?含溶液

java - 从外部 fragment 内的 FragmentTabHost 的子 fragment 添加新的选项菜单

android - list 中 facebook 应用程序的应用程序 ID 错误

java - 如何在android studio中处理双击事件onclicklistener?

Android:如何将页面加载到 WebView 中,然后对其应用一些自定义 css?

android - 如何添加自定义动画viewpager

android - ViewPager 在 Coordinator 布局中的高度超过可用

Android 4.0.x 和 4.1.x viewPager 错误?

android - 下载 Holo Dark 抽屉导航图标

android - 根据哪个 Activity 包含 fragment 执行 Intent