当我在另一个片段中输入片段时,我的应用程序停止工作

时间:2017-04-09 01:44:56

标签: java android android-fragments

我有一个包含NavigationDrawer的Activity,如果我输入某个项目,这个NavDrawer会启动一个片段。因此,在其中一个中,我有一个片段,其中包含带有4个片段的TabHost,使用PageViewer(PacksFragment)进行滑动效果。

问题留在TabHost的第一个片段,即TabFragmentA。当我在做界面时,它会打开并正常运行。但是当我开始编程时,每次我要测试,或者应用程序无法打开,或者当我输入TabFragmentA的片段父级时应用程序停止工作

活动和片段的顺序是这样的: MainActivity> PacksFragment> TabFragmentA,TabFragmentB,TabFragmentC,TabFragmentD

PacksFragment.java

public class PacksFragment extends Fragment
        implements ViewPager.OnPageChangeListener, TabHost.OnTabChangeListener {

    TabHost tabHost;
    ViewPager viewPager;

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

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View view = inflater.inflate(R.layout.fragment_packs, container, false);

        final TabHost host = (TabHost) view.findViewById(R.id.tabhost);
        host.setup();

        viewPager = (ViewPager) view.findViewById(R.id.viewPager);
        List<Fragment> listFragments = new ArrayList<Fragment>();
        listFragments.add(new TabFragmentA());
        listFragments.add(new TabFragmentB());
        listFragments.add(new TabFragmentC());
        listFragments.add(new TabFragmentD());

        MyFragmentPagerAdapter myFragmentPagerAdapter = new MyFragmentPagerAdapter(
                getFragmentManager(), listFragments);
        viewPager.setAdapter(myFragmentPagerAdapter);
        viewPager.setOnPageChangeListener(this);

        tabHost = (TabHost) view.findViewById(R.id.tabhost);
        tabHost.setup();

        String[] tabNames = {"NUIA", "HARANYA", "OCEANIC", "AURORIA"};
        for(int i=0; i<tabNames.length; i++) {
            TabHost.TabSpec tabSpec;
            tabSpec = tabHost.newTabSpec(tabNames[i]);
            tabSpec.setIndicator(tabNames[i]);
            tabSpec.setContent(new FakeContent(getActivity().getApplicationContext()));
            tabHost.addTab(tabSpec);
            View tabView = host.getTabWidget().getChildTabViewAt(i);
            tabView.setPadding(0, 0, 0, 0);
            TextView tv = (TextView)tabView.findViewById(android.R.id.title);
            tv.setSingleLine();
            tv.setTextSize(13);
            tv.setTextColor(0xFFFFFFFF);
        }

        tabHost.setOnTabChangedListener(this);

        return view;
    }

    public class FakeContent implements TabHost.TabContentFactory {

        Context context;
        public FakeContent(Context mcontext) {
            context = mcontext;
        }

        @Override
        public View createTabContent(String tag) {
            View fakeView = new View(context);
            fakeView.setMinimumHeight(0);
            fakeView.setMinimumWidth(0);
            return fakeView;
        }

    }

    @Override
    public void onTabChanged(String tabId) {
        int selectedItem = tabHost.getCurrentTab();
        viewPager.setCurrentItem(selectedItem);
    }

    @Override
    public void onPageScrollStateChanged(int arg0) {

    }

    @Override
    public void onPageScrolled(int arg0, float arg1, int arg2) {

    }

    @Override
    public void onPageSelected(int selectedItem) {
        tabHost.setCurrentTab(selectedItem);
    }

}

TabFragmentA.java

public class TabFragmentA extends Fragment {

    Spinner spinnerLocalCrafting;
    private static final String[]locates = {"Solzreed Peninsula", "Gweonid Forest", "Lilyut Hills", "Dewstone Planes", "White Arden",
    "Marianople", "Two Crowns", "Cinderstone Moore", "Halcyona", "Hellswamp", "Sanddeep", "Airain Rock", "Aubre Cradle",
    "Ahnimar", "Karkasse Ridgelands"};
    private List<RadioButton> tipoPackRadioButtons;
    private static final int[] IDS_TIPOPACK_RADIO = { R.id.tipoPackRadio1, R.id.tipoPackRadio2, R.id.tipoPackRadio3,
            R.id.tipoPackRadio4, R.id.tipoPackRadio5, R.id.tipoPackRadio6};

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

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

        //Spinner
        spinnerLocalCrafting = (Spinner) v.findViewById(R.id.spinnerLocalCrafting);
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_spinner_item, locates);
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spinnerLocalCrafting.setAdapter(adapter);
        spinnerLocalCrafting.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                //TabFragmentA tabFragmentA = new TabFragmentA();
                //tabFragmentA.setSpinnerSelected(position);
                //methodCalculate();
            }
            @Override
            public void onNothingSelected(AdapterView<?> parent) {
            }
        });

        Log.d("FUCK", String.valueOf(getActivity()));
        // Not return NULL

        //RadioButtons

        tipoPackRadioButtons = new ArrayList<RadioButton>();
        for(int id : IDS_TIPOPACK_RADIO) {
            RadioButton tipoPackRadioBt = (RadioButton) v.findViewById(id);
            tipoPackRadioButtons.add(tipoPackRadioBt);
        }

        //RadioGroup
        RadioGroup radioGroupTipoPack = new RadioGroup(getActivity());
        int count2 = 0;
        while(count2 < 6) {
            radioGroupTipoPack.addView(tipoPackRadioButtons.get(count2));
            count2++;
        }

        return v;
    }

    public static TabFragmentA newInstance(String text) {

        TabFragmentA f = new TabFragmentA();
        Bundle b = new Bundle();
        b.putString("msg", text);

        f.setArguments(b);

        return f;
    }

    /*public static int spinnerSelected;
    public static void setSpinnerSelected(int spinnerSelected) {
        TabFragmentA.spinnerSelected = spinnerSelected;
    }*/

    /*public void methodCalculate() {

        int count = 0;
        while(count < 16) {
            switch (spinnerSelected) {
                case count:

                    break;
            }
            count++;
        }

    }*/

}

在日志中出现 enter image description here

1 个答案:

答案 0 :(得分:1)

您尝试将RadioButton添加到已添加到另一个View的{​​{1}}。在这一行中,您可以从View获得RadioButton

View

然后您尝试再次将它们添加到RadioButton tipoPackRadioBt = (RadioButton) v.findViewById(id);

View

1-如果您已经在radioGroupTipoPack.addView(tipoPackRadioButtons.get(count2)); 中定义了RadioButton,则无需再次添加它们,只需通过xml找到它们并根据需要进行编辑 - &gt ;删除第二行

2-如果您想在运行时动态定义findViewById,只需将RadioButton留空,然后充气或创建RadioGroup并将其添加到群组中 - &gt;删除第1行。

PS:你也可以尝试从他们的父RadioButton删除RadioButton并将其添加到另一个view但是它容易出错,你应该避免这样做,除非你真的需要..