连接到活动的多个片段的问题

时间:2014-07-11 16:23:01

标签: android android-activity android-fragments android-studio

  

ANSWER :在这里,大师们非常感谢你们,让我觉得我走错了路。我发现了一个类似的问题,拯救了我的屁股,并带我大约10来得到我的狗屎收集... 在这里你去: How to implement a ViewPager with different Fragments / Layouts

问题:

我知道这里有一些关于碎片的问题,但我没有在那里找到答案。

我正在尝试将三个片段连接到CalendarActivity。我认为最好在代码中解释。

我得到的错误http://postimg.org/image/aca9ndfdb/ 我尝试了很多不同的进口,但我不能想象如何实现这一点,所以会很感激一些帮助。 如果我在创建fragmentMananger / fragmentTransaction时删除 android.app ,我会得到:http://postimg.org/image/dy2av2zp9/

这是CalendarActicity

package ru.calendar;

import android.app.ActionBar;
import android.app.ActionBar.TabListener;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.util.Log;

import jBerry.MySugar.R;

public class CalendarActivity extends FragmentActivity implements TabListener  {

    @Override
    protected void onCreate(Bundle arg0) {
        super.onCreate(arg0);
        setContentView(R.layout.activity_calendar);

        FragmentManager fragmentManager = getSupportFragmentManager();
        FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
        FragmentA frag = new FragmentA();
        fragmentTransaction.replace(android.R.id.content, frag);

        fragmentTransaction.commit();



        ActionBar actionBar;
        ViewPager viewPager;

        viewPager = (ViewPager) findViewById(R.id.calendarContainer);
        viewPager.setAdapter(new MyAdapter(getSupportFragmentManager()));
        viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {

            @Override
            public void onPageSelected(int arg0) {
                actionBar.setSelectedNavigationItem(arg0);
                // Intent intent = new Intent(this, CalendarActivity.class);
                // startActivity(intent);
                Log.d("DpoiNT", "onPageSelected at " + " position " + arg0);

            }

            @Override
            public void onPageScrolled(int arg0, float arg1, int arg2) {
                //    Log.d("DpoiNT", "onPageScrolled at "+" position " +arg0+" from " +arg1+" with number of pixels "+arg2);

            }


            @Override
            public void onPageScrollStateChanged(int arg0) {
                if(arg0== ViewPager.SCROLL_STATE_IDLE){
                    Log.d("DpoiNT", "onPageScrollStateChanged Idle");
                }
                if(arg0== ViewPager.SCROLL_STATE_DRAGGING){
                    Log.d("DpoiNT", "onPageScrollStateChanged Dragging");
                }
                if(arg0== ViewPager.SCROLL_STATE_SETTLING){
                    Log.d("DpoiNT", "onPageScrollStateChanged Settling");
                }

            }
        });

    actionBar = getActionBar();
    assert actionBar != null;
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

    ActionBar.Tab tab1=actionBar.newTab();
    tab1.setText("Tab 1");
    tab1.setTabListener(this);

    ActionBar.Tab tab2=actionBar.newTab();
    tab2.setText("Tab 2");
    tab2.setTabListener(this);

    ActionBar.Tab tab3=actionBar.newTab();
    tab3.setText("Tab 3");
    tab3.setTabListener(this);

    actionBar.addTab(tab1);
    actionBar.addTab(tab2);
    actionBar.addTab(tab3);
}


    @Override
    public void onTabSelected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {
        // Log.d("DpoiNT", "onTabSelected at "+" position " +tab.getPosition()+" name "+tab.getText());
        viewPager.setCurrentItem(tab.getPosition());
    }

    @Override
    public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {
        // Log.d("DpoiNT", "onTabUnselected at "+" position " +tab.getPosition()+" name "+tab.getText());

    }

    @Override
    public void onTabReselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {
        // Log.d("DpoiNT", "onTabReselected at "+" position "+tab.getPosition()+" name "+tab.getText());

    }
}


class MyAdapter extends FragmentPagerAdapter {


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



    @Override
    public Fragment getItem(int arg0) {
        Fragment fragment=null;
        if(arg0 == 0) {
            fragment = new FragmentA();
        }

        if(arg0 == 1) {
        fragment = new FragmentB();
        }

        if(arg0 == 2) {
            fragment = new FragmentC();
        }

        return fragment;
    }

    @Override
    public int getCount() {
        return 3;
    }
}

这是CalendarActivity(activity_calendar)的xml:

<android.support.v4.view.ViewPager
<!-- ViewPager for swipe function in CalendarActivity -->

    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="ru.calendar.CalendarActivity"
    android:id="@+id/calendarContainer">

    <fragment
        android:id="@+id/fragment_a"
        android:layout_weight="1"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:background="#ffffff"
        class="ru.calendar.FragmentA" />

    <fragment
        android:id="@+id/fragment_b"
        android:layout_weight="2"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        class="ru.calendar.FragmentB" />

    <fragment
        android:id="@+id/fragment_c"
        android:layout_weight="2"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        class="ru.calendar.FragmentC" />

</android.support.v4.view.ViewPager>

这就是一个fragment.xml的样子:

public class FragmentA extends Fragment {

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

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

编辑以下是CalendarActivity的一部分......

    viewPager = (ViewPager) findViewById(R.id.calendarContainer);
    viewPager.setAdapter(new MyAdapter(getSupportFragmentManager()));
    viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {

        @Override
        public void onPageSelected(int arg0) {
            actionBar.setSelectedNavigationItem(arg0);
            // Intent intent = new Intent(this, CalendarActivity.class);
            // startActivity(intent);
            Log.d("DpoiNT", "onPageSelected at " + " position " + arg0);

        }

        @Override
        public void onPageScrolled(int arg0, float arg1, int arg2) {
            //    Log.d("DpoiNT", "onPageScrolled at "+" position " +arg0+" from " +arg1+" with number of pixels "+arg2);

        }


        @Override
        public void onPageScrollStateChanged(int arg0) {
            if(arg0== ViewPager.SCROLL_STATE_IDLE){
                Log.d("DpoiNT", "onPageScrollStateChanged Idle");
            }
            if(arg0== ViewPager.SCROLL_STATE_DRAGGING){
                Log.d("DpoiNT", "onPageScrollStateChanged Dragging");
            }
            if(arg0== ViewPager.SCROLL_STATE_SETTLING){
                Log.d("DpoiNT", "onPageScrollStateChanged Settling");
            }

        }
    });


class MyAdapter extends FragmentPagerAdapter {
    public MyAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int arg0) {
        Fragment fragment=null;
        if(arg0 == 0) {
            fragment = new FragmentA();
        }

        if(arg0 == 1) {
            fragment = new FragmentB();
        }

        if(arg0 == 2) {
            fragment = new FragmentC();
        }

        return fragment;
    }

    @Override
    public int getCount() {
    return 3;
    }
}

2 个答案:

答案 0 :(得分:0)

您正在使用支持库中的片段。对于他们,您必须使用SupportFragmentManager。你可以通过调用

来获得它
getSupportFragmentManager() 

而不是

getFragmentManager()

答案 1 :(得分:0)

这不是你用片段查看寻呼机的方法;你需要使用PagerAdapter,并且你没有在xml中定义你的片段,它应该由适配器在代码中动态实例化。

http://developer.android.com/reference/android/support/v4/view/PagerAdapter.html http://developer.android.com/training/animation/screen-slide.html

此部分代码仅用于默认布局和单个片段。

android.app.FragmentManager fragmentManager = getFragmentManager();
android.app.FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
FragmentA frag = new FragmentA();
fragmentTransaction.replace(android.R.id.content, frag);

fragmentTransaction.commit();

只需按照浏览分页器指南。

或者,如果您希望在同一活动中同时拥有多个片段,并且同时在同一屏幕上,则您不能使用视图寻呼机。您需要一个根视图组,其中包含少量在主xml中具有id的视图组,并使用您在上面获得的代码。

...
fragmentTransaction.replace([ID of the view group you want your fragment to be in], frag);
...

你已经决定了你想要做的事情。