java.lang.RuntimeException:无法启动活动ComponentInfo java.lang.Iol



我正在处理一个片段,但它总是抛出一个错误,即它无法启动活动,因为片段没有附加到活动,请帮我弄清楚我在哪里捣乱以下是我的片段和活动代码:

碎片

package com.sarham.kabs.fruity;
import android.app.Activity;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.ListFragment;
import android.support.v7.app.ActionBarDrawerToggle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ListView;
import adapters.CategoriesListAdapter;
/**
 * Created by Kabunyi Wanja on 22/03/2015.
 */
public class CategoriesFragment extends ListFragment {
    private ListView categoriesListView;
    private String[] categoriesArray = getResources().getStringArray(R.array.drawer_list);
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.categories_fragment, container, false);
        categoriesListView = (ListView)v.findViewById(android.R.id.list);
        //setCategoriesListAdapter();
        //Log.d("ADAPTER: ", "Adapter has been set for listview");
        return v;
    }
    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        setCategoriesListAdapter();
    }
    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
    }
    //set adapter to categoriesListView
    public void setCategoriesListAdapter(){
        categoriesListView.setAdapter(new CategoriesListAdapter(getActivity(), categoriesArray));
    }
}

活动

package com.sarham.kabs.fruity;
import android.content.res.Configuration;
import android.os.PersistableBundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.support.v7.app.ActionBarDrawerToggle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;

public class MainActivity extends ActionBarActivity implements AdapterView.OnItemClickListener{
    private DrawerLayout drawerLayout;
    private ListView listView;
    private String[] planets;
    private ActionBarDrawerToggle drawerListener;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        drawerLayout = (DrawerLayout)findViewById(R.id.drawerLayout);
        listView = (ListView)findViewById(R.id.drawerListView);
        planets = getResources().getStringArray(R.array.planets);
        listView.setAdapter(new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, planets));
        listView.setOnItemClickListener(this);
        drawerListener = new ActionBarDrawerToggle(this, drawerLayout,R.string.drawer_open, R.string.drawer_close){
            @Override
            public void onDrawerOpened(View drawerView) {
                super.onDrawerOpened(drawerView);
                Toast.makeText(MainActivity.this,"Drawer Open", Toast.LENGTH_LONG).show();
            }
            @Override
            public void onDrawerClosed(View drawerView) {
                super.onDrawerClosed(drawerView);
                Toast.makeText(MainActivity.this, "Drawer Closed", Toast.LENGTH_LONG).show();
            }
        };
        drawerLayout.setDrawerListener(drawerListener);
        getSupportActionBar().setHomeButtonEnabled(true);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        CategoriesFragment categories = new CategoriesFragment();
        addFragment(R.id.drawerLayout, categories, "CATEGORIES");
    }
    @Override
    public void onPostCreate(Bundle savedInstanceState, PersistableBundle persistentState) {
        super.onPostCreate(savedInstanceState, persistentState);
        drawerListener.syncState();
    }
    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        drawerListener.onConfigurationChanged(newConfig);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        if(drawerListener.onOptionsItemSelected(item)){
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        Toast.makeText(this, planets[position]+" Was selected", Toast.LENGTH_SHORT).show();
        selectItem(position);
        switch (position){
            case 0:
                CategoriesFragment categories = new CategoriesFragment();
                addFragment(R.id.drawerLayout, categories, "CATEGORIES");
                break;
            case 1:
                Toast.makeText(this, "Settings was selected", Toast.LENGTH_SHORT).show();
                break;
            case 2:
                Toast.makeText(this, "Exit was selected", Toast.LENGTH_SHORT).show();
                finish();
                break;
            default:
        }
    }
    public void selectItem(int position){
        listView.setItemChecked(position, true);
        setTitle(planets[position]);
    }
    //set ActionBar title
    public void setTitle(String title){
        getSupportActionBar().setTitle(title);
    }
    //call this method to add a fragment
    public void addFragment(int containerViewId, Fragment fragment, String tag){
        FragmentManager manager = getSupportFragmentManager();
        FragmentTransaction transaction = manager.beginTransaction();
        transaction.add(containerViewId, fragment, tag);
        transaction.commit();
    }
}

以下是LogCat输出:

Caused by: java.lang.IllegalStateException: Fragment CategoriesFragment{41545e80} not attached to Activity
            at android.support.v4.app.Fragment.getResources(Fragment.java:619)
            at com.sarham.kabs.fruity.CategoriesFragment.<init>(CategoriesFragment.java:21)
            at com.sarham.kabs.fruity.MainActivity.onCreate(MainActivity.java:55)
            at android.app.Activity.performCreate(Activity.java:5020)
            at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2148)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2211)
            at android.app.ActivityThread.access$600(ActivityThread.java:149)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1300)
            at android.os.Handler.dispatchMessage(Handler.java:99)
            at android.os.Looper.loop(Looper.java:153)
            at android.app.ActivityThread.main(ActivityThread.java:5086)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:511)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:821)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:584)
            at dalvik.system.NativeStart.main(Native Method)

在仔细分析Fragment生命周期时,不可能像我所做的那样使用getResources().getStringArray(…)来执行提取字符串资源之类的操作,这必须在方法onActivityCreated(…)中完成

相关内容

最新更新