【问题标题】:Fragment and FragmentList Android Studio "Unable to start activity ComponentInfo"Fragment 和 FragmentList Android Studio“无法启动活动 ComponentInfo”
【发布时间】:2015-04-20 18:24:16
【问题描述】:

我不知道我做错了什么,但是我的应用程序在启动时崩溃了。我想用 FragmentActivity 实现标签栏列表。 我真的需要帮助:( 返回的错误是:

Unable to start activity ComponentInfo
Caused by: java.lang.NullPointerException
            at jardelcompany.bundoransurfco.MainActivity.onCreate(MainActivity.java:79)

(第 79 行是actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

MainActivity.java:

public class MainActivity extends FragmentActivity implements
        ActionBar.TabListener {
SectionsPagerAdapter mSectionsPagerAdapter;
ViewPager mViewPager;
 protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        final ActionBar actionBar = getActionBar();
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

        mSectionsPagerAdapter = new SectionsPagerAdapter(this,
                getSupportFragmentManager());

        mViewPager = (ViewPager) findViewById(R.id.pager);
        mViewPager.setAdapter(mSectionsPagerAdapter);

        mViewPager
                .setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
                    @Override
                    public void onPageSelected(int position) {
                        actionBar.setSelectedNavigationItem(position);
                    }
                });

        for (int i = 0; i < mSectionsPagerAdapter.getCount(); i++) {
            actionBar.addTab(actionBar.newTab()
                    .setText(mSectionsPagerAdapter.getPageTitle(i))
                    .setTabListener(this));
        }

activity_main.xml:

<RelativeLayout 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=".MainActivity"
    android:id="@+id/mainLayout"
    android:background="#FFFFFF"> />
    <view
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        class="android.support.v4.view.ViewPager"
        android:id="@+id/pager"/>
</RelativeLayout>

我将 SectionsPagerAdapter 用于 FragmentPageAdapter

SectionsPagerAdapter.java:

public class SectionsPagerAdapter extends FragmentPagerAdapter {

    protected Context mContext;

    public SectionsPagerAdapter(Context context, FragmentManager fm) {
        super(fm);
        mContext = context;
    }

    @Override
    public Fragment getItem(int position) {
        switch(position) {
            case 0:
                return new FirstFragment();
            case 1:
                return new LoginFragment();
        }

        return null;
    }

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

    @Override
    public CharSequence getPageTitle(int position) {
        Locale l = Locale.getDefault();
        switch (position) {
            case 0:
                return mContext.getString(R.string.title_section1).toUpperCase(l);
            case 1:
                return mContext.getString(R.string.title_section2).toUpperCase(l);
        }
        return null;
    }
}

FirstFragment.java:

public class FirstFragment extends ListFragment {

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

        return rootView;
    }
}

LoginFragment.java:

    public class LoginFragment extends ListFragment {

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

            return rootView;
        }
}

这是我的 AndroidManifest.xml :

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="jardelcompany.bundoransurfco" >

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.USE_CREDENTIALS" /> <!-- To retrieve the account name (email) as part of sign-in: -->
    <uses-permission android:name="android.permission.GET_ACCOUNTS" /> <!-- To auto-complete the email text field in the login form with the user's emails -->
    <uses-permission android:name="android.permission.READ_PROFILE" />
    <uses-permission android:name="android.permission.READ_CONTACTS" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name"
            android:screenOrientation="portrait" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".LoginActivity"
            android:label="@string/title_activity_login"
            android:parentActivityName=".MainActivity"
            android:screenOrientation="portrait"
            android:windowSoftInputMode="adjustResize|stateVisible" >
        </activity>
    </application>

</manifest>

还有我的styles.xml:

<resources>

    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
    </style>

</resources>

【问题讨论】:

  • getActionBar() return(!) null ,请调查一下
  • 那是因为 getActionBar 正在重新调整 null 因为您的活动没有操作栏,它是一个片段活动
  • 你也过早地关闭了你的 relativeLayout 标签。
  • 实际上 getActionBar() 可以在 onCreate() 中返回 null(好像太早了),但不会在 onResume() 中返回。这就是第 79 行出现 NPE 的原因。
  • @TomerShemesh 那么我要修改什么? ://

标签: java android android-fragments android-listfragment


【解决方案1】:

将此代码删除到单独的方法中,例如:

private void initUI(){
final ActionBar actionBar = getActionBar();
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

        mSectionsPagerAdapter = new SectionsPagerAdapter(this,
                getSupportFragmentManager());

        mViewPager = (ViewPager) findViewById(R.id.pager);
        mViewPager.setAdapter(mSectionsPagerAdapter);

        mViewPager
                .setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
                    @Override
                    public void onPageSelected(int position) {
                        actionBar.setSelectedNavigationItem(position);
                    }
                });

        for (int i = 0; i < mSectionsPagerAdapter.getCount(); i++) {
            actionBar.addTab(actionBar.newTab()
                    .setText(mSectionsPagerAdapter.getPageTitle(i))
                    .setTabListener(this));
        }
}

并从onResume() 而不是onCreate() 调用此方法。你也在使用getActionBar(),同时使用getSupportFragmentManager(),也许你应该使用getSupportActionBar()?您项目的最低 API 级别是多少?

【讨论】:

  • 非常感谢您的帮助,但 getSupportActionBar() 无法识别... :( 我的目标是 API 14 (4.0)
  • 然后尝试使用getActionBar();而是。
  • 应用程序启动,但没有操作栏:(
  • 我用我的 AndroidManifest 编辑了我的帖子,也许是操作栏没有显示的问题...?
  • 在 onResume() 中也崩溃 ... :( 在这一行,并返回 Null : actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
【解决方案2】:

尝试将这行代码添加到清单文件中

  <uses-sdk
    android:minSdkVersion="11"
    android:targetSdkVersion="14" />

【讨论】:

  • @xcode_Dev 你为什么不尝试让你的类扩展 ActionBarActivity ?不确定这是否符合您的要求。
  • 您没有指定最低 api 级别。将其指定为 api 11 或更高版本,看看是否有帮助
  • 请看一下我上次用styles.xml更新...也许问题来自这里?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-23
  • 1970-01-01
相关资源
最近更新 更多