片段未附加到活动

时间:2016-06-15 21:30:53

标签: android

我有TabLayot的活动。

public class MapTab extends AppCompatActivity {

private Toolbar toolbar;
private TabLayout tabLayout;
private ViewPager viewPager;


public MapTab() {
}

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

    toolbar = (Toolbar)findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);

    viewPager = (ViewPager)findViewById(R.id.viewPager);
    setupViewPager(viewPager);

    tabLayout = (TabLayout)findViewById(R.id.tabs);
    tabLayout.setupWithViewPager(viewPager);
}

private void setupViewPager(ViewPager viewPager) {
    ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
    adapter.addFragment(new PvPMap(), "PvP Карты");
    adapter.addFragment(new PvEMap(), "PvE Карты");
    viewPager.setAdapter(adapter);
}

class ViewPagerAdapter extends FragmentPagerAdapter {
    private final List<Fragment> mFragmentList = new ArrayList<>();
    private final List<String> mFragmentTitleList = new ArrayList<>();

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

    @Override
    public Fragment getItem(int position) {
        return mFragmentList.get(position);
    }

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

    public void addFragment(Fragment fragment, String title) {
        mFragmentList.add(fragment);
        mFragmentTitleList.add(title);
    }

    @Override
    public CharSequence getPageTitle(int position) {
        return mFragmentTitleList.get(position);
    }
}

XML

<android.support.design.widget.AppBarLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    >

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:layout_scrollFlags = "scroll|enterAlways"
        />
    <android.support.design.widget.TabLayout
        android:id="@+id/tabs"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:tabMode="fixed"
        app:tabGravity="center"
        />
</android.support.design.widget.AppBarLayout>
<android.support.v4.view.ViewPager
    android:id="@+id/viewPager"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    />

在第一个标签中,ListFragment

public class PvPMap extends ListFragment {

Fragment permafrost;
Fragment river;
Fragment reactor;
Fragment oil;
Fragment mountain;
Fragment island;
Fragment cold;
Fragment pis;
Fragment fire;
Fragment air;

FragmentManager manager;
FragmentTransaction transaction;


String [] mapname = new String[] {"Вечная мерзлота","Тихая река","Реактор","Нефтепровод","Предгорье",
        "Затеряный остров","Холодная сталь","Мирный рубеж","Горящий песок","Воздушная тревога"};
int [] mapimg = new int[] {R.drawable.permafrost, R.drawable.river, R.drawable.reaktor, R.drawable.oil, R.drawable.mauntain,
        R.drawable.island, R.drawable.cold, R.drawable.pis, R.drawable.fire, R.drawable.air};
String [] mapinfo = new String[] {getResources().getString(R.string.permafrostInfo), getResources().getString(R.string.riverInfo),
        getResources().getString(R.string.reaktorInfo), getResources().getString(R.string.oilInfo),
        getResources().getString(R.string.mauntainInfo), getResources().getString(R.string.islandInfo),
        getResources().getString(R.string.coldInfo), getResources().getString(R.string.pisInfo),
        getResources().getString(R.string.fireInfo), getResources().getString(R.string.airInfo),};



@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View pvp = inflater.inflate(R.layout.layout_pvp, container, false);

    permafrost = new Permafrost();
    river = new River();
    reactor = new Reactor();
    oil = new Oil();
    mountain = new Mauntain();
    island = new Island();
    cold = new Cold();
    pis = new Pis();
    fire = new Fire();
    air = new Air();

    List<HashMap<String, String>> aList =  new ArrayList<HashMap<String, String>>();

    for (int i = 0; i < mapname.length; i++){
        HashMap<String, String> m = new HashMap<String,String>();
        m.put("name", mapname[i]);
        m.put("info", mapinfo[i]);
        m.put("img", Integer.toString(mapimg[i]));
        aList.add(m);
    }

    String[] from = {"name", "info", "img"};

    int [] to = {R.id.textViewMap, R.id.textViewInfo, R.id.imageViewMap};

    SimpleAdapter adapter = new SimpleAdapter(getActivity().getBaseContext(), aList, R.layout.list_item, from, to);

    setListAdapter(adapter);

    return pvp;
}

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

    switch (position){
        case 0:
            transaction.replace(R.id.container, permafrost);
            transaction.addToBackStack(null);
            break;
        case 1:
            transaction.replace(R.id.container, river);
            transaction.addToBackStack(null);
            break;
        case 2:
            transaction.replace(R.id.container, reactor);
            transaction.addToBackStack(null);
            break;
        case 3:
            transaction.replace(R.id.container, oil);
            transaction.addToBackStack(null);
            break;
        case 4:
            transaction.replace(R.id.container, mountain);
            transaction.addToBackStack(null);
            break;
        case 5:
            transaction.replace(R.id.container, island);
            transaction.addToBackStack(null);
            break;
        case 6:
            transaction.replace(R.id.container, cold);
            transaction.addToBackStack(null);
            break;
        case 7:
            transaction.replace(R.id.container, pis);
            transaction.addToBackStack(null);
            break;
        case 8:
            transaction.replace(R.id.container, fire);
            transaction.addToBackStack(null);
            break;
        case 9:
            transaction.replace(R.id.container, air);
            transaction.addToBackStack(null);
            break;

    }
    transaction.commit();
}

仅限二级文字。

当我使用TabLayout进行活动时会发生错误:

06-15 16:52:09.520 29302-29302/com.example.roman.armoredwarfare E/AndroidRuntime: FATAL EXCEPTION: main
                                                                              Process: com.example.roman.armoredwarfare, PID: 29302
                                                                              java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.roman.armoredwarfare/com.example.roman.armoredwarfare.MapTab}: java.lang.IllegalStateException: Fragment PvPMap{11d5eb92} not attached to Activity
                                                                                  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2534)
                                                                                  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2608)
                                                                                  at android.app.ActivityThread.access$800(ActivityThread.java:178)
                                                                                  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1470)
                                                                                  at android.os.Handler.dispatchMessage(Handler.java:111)
                                                                                  at android.os.Looper.loop(Looper.java:194)
                                                                                  at android.app.ActivityThread.main(ActivityThread.java:5637)
                                                                                  at java.lang.reflect.Method.invoke(Native Method)
                                                                                  at java.lang.reflect.Method.invoke(Method.java:372)
                                                                                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:959)
                                                                                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:754)
                                                                               Caused by: java.lang.IllegalStateException: Fragment PvPMap{11d5eb92} not attached to Activity
                                                                                  at android.support.v4.app.Fragment.getResources(Fragment.java:636)
                                                                                  at com.example.roman.armoredwarfare.PvPMap.<init>(PvPMap.java:55)
                                                                                  at com.example.roman.armoredwarfare.MapTab.setupViewPager(MapTab.java:47)
                                                                                  at com.example.roman.armoredwarfare.MapTab.onCreate(MapTab.java:39)
                                                                                  at android.app.Activity.performCreate(Activity.java:6092)
                                                                                  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1112)
                                                                                  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2481)
                                                                                  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2608) 
                                                                                  at android.app.ActivityThread.access$800(ActivityThread.java:178) 
                                                                                  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1470) 
                                                                                  at android.os.Handler.dispatchMessage(Handler.java:111) 
                                                                                  at android.os.Looper.loop(Looper.java:194) 
                                                                                  at android.app.ActivityThread.main(ActivityThread.java:5637) 
                                                                                  at java.lang.reflect.Method.invoke(Native Method) 
                                                                                  at java.lang.reflect.Method.invoke(Method.java:372) 
                                                                                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:959) 
                                                                                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:754) 

特别是1:

String [] mapinfo = new String[] {getResources().getString(R.string.permafrostInfo), getResources().getString(R.string.riverInfo),
        getResources().getString(R.string.reaktorInfo), getResources().getString(R.string.oilInfo),
        getResources().getString(R.string.mauntainInfo), getResources().getString(R.string.islandInfo),
        getResources().getString(R.string.coldInfo), getResources().getString(R.string.pisInfo),
        getResources().getString(R.string.fireInfo), getResources().getString(R.string.airInfo),};
带有ListFragment的片段中的

2:setupViewPager(viewPager);

3:adapter.addFragment(new PvPMap(), "PvP Карты");

使用TabLayot

进行活动

对不起,我的英语不太好。

2 个答案:

答案 0 :(得分:3)

在片段实例化之前,您正尝试访问getResources()中所需的上下文。

String [] mapinfo = new String[] {getResources().getString(R.string.permafrostInfo), getResources().getString(R.string.riverInfo),
        getResources().getString(R.string.reaktorInfo), getResources().getString(R.string.oilInfo),
        getResources().getString(R.string.mauntainInfo), getResources().getString(R.string.islandInfo),
        getResources().getString(R.string.coldInfo), getResources().getString(R.string.pisInfo),
        getResources().getString(R.string.fireInfo), getResources().getString(R.string.airInfo),};

你应该在{1}}充气之后或onCreateView()像这样 -

onCreate()

答案 1 :(得分:0)

问题在于mapinfo变量的初始化。它在创建片段实例时调用getResources()(并且片段尚未附加)。

您可以在onCreate方法中初始化mapinfo

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mapinfo = new String[] {getResources().getString(R.string.permafrostInfo), getResources().getString(R.string.riverInfo),
        getResources().getString(R.string.reaktorInfo), getResources().getString(R.string.oilInfo),
        getResources().getString(R.string.mauntainInfo), getResources().getString(R.string.islandInfo),
        getResources().getString(R.string.coldInfo), getResources().getString(R.string.pisInfo),
        getResources().getString(R.string.fireInfo), getResources().getString(R.string.airInfo),};
}