操作栏不显示

Action Bar not Displaying

我试图在我的操作栏上放置一个向上按钮,但我的应用程序没有显示该片段的操作栏。我的主要 activity 片段有一个操作栏,只是它启动的片段没有,所以当我调用 getActivity().getActionBar().setDisplayHomeAsUpEnabled(true) 时,应用程序会抛出 nullPointerException。 (下面的 NPE 堆栈跟踪 1 中的堆栈跟踪)。

我试过使用 getActionBar.show() 并将主题设置为 Theme.Holo.Light,按照 here 的建议。 getActionBar.show(),但这会使应用程序崩溃并出现 nullPointerException。当我尝试使用 Theme.Holo.Light 时,它告诉我必须使用 appcompat 主题 ("You need to use a Theme.AppCompat theme (or descendant) with this activity.")

我四处寻找如何修复该错误,但人们建议 none AppCompat 主题解决了此片段上没有操作栏的问题。人们提出的任何建议都表示赞赏。下面的代码。

不显示操作栏的片段:

import android.annotation.TargetApi;
import android.app.Activity;
import android.app.Fragment;
import android.app.FragmentManager;
import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import android.support.v4.app.NavUtils;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.EditText;

import java.util.Date;
import java.util.UUID;

public class CrimeFragment extends Fragment {
public static final String EXTRA_CRIME_ID = "com.bignerdranch.android.criminalintent,crime_id";

private static final String DIALOG_DATE = "date";
private static final int REQUEST_DATE = 0;

private Crime mCrime;
private EditText mTitleField;
private Button mDateButton;
private CheckBox mSolvedCheckBox;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setHasOptionsMenu(true);

    UUID crimeId = (UUID)getArguments().getSerializable(EXTRA_CRIME_ID);

    mCrime = CrimeLab.get(getActivity()).getCrime(crimeId);
}

@TargetApi(11)
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.fragment_crime, parent, false);

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
        if (NavUtils.getParentActivityName(getActivity()) != null)  {
            //getActivity().getActionBar().setDisplayHomeAsUpEnabled(true);
        }
    }

    mTitleField = (EditText)v.findViewById(R.id.crime_title);
    mTitleField.setText(mCrime.getTitle());
    mTitleField.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
            //This space intentionally left blank
        }

        @Override
        public void onTextChanged(CharSequence c, int start, int before, int count) {
            mCrime.setTitle(c.toString());
        }

        @Override
        public void afterTextChanged(Editable s) {
            //This space intentionally left blank
        }
    });

    mDateButton = (Button)v.findViewById(R.id.crime_date);
    updateDate();
    mDateButton.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            FragmentManager fm = getActivity().getFragmentManager();
            DatePickerFragment dialog = DatePickerFragment.newInstance(mCrime.getDate());
            dialog.setTargetFragment(CrimeFragment.this, REQUEST_DATE);
            dialog.show(fm, DIALOG_DATE);
        }
    });

    mSolvedCheckBox = (CheckBox)v.findViewById(R.id.crime_solved);
    mSolvedCheckBox.setChecked(mCrime.isSolved());
    mSolvedCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            mCrime.setSolved(isChecked);
        }
    });

    return v;
}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data)  {
    if (resultCode != Activity.RESULT_OK) return;
    if (requestCode == REQUEST_DATE)    {
        Date date = (Date)data.getSerializableExtra(DatePickerFragment.EXTRA_DATE);
        mCrime.setDate(date);
        updateDate();
    }
}

public static CrimeFragment newInstance(UUID crimeId)   {
    Bundle args = new Bundle();
    args.putSerializable(EXTRA_CRIME_ID, crimeId);

    CrimeFragment fragment = new CrimeFragment();
    fragment.setArguments(args);

    return fragment;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch(item.getItemId())    {
        case R.id.home:
            if (NavUtils.getParentActivityName(getActivity()) != null)  {
                NavUtils.navigateUpFromSameTask(getActivity());
            }
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}

private void updateDate()   {
    mDateButton.setText(mCrime.getDate().toString());
}
}

片段XML:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
>

<TextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="@string/crime_title_label"
    style="?android:listSeparatorTextViewStyle"
    />

<EditText
    android:id="@+id/crime_title"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:hint="@string/crime_title_hint"
    />

<TextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="@string/crime_details_label"
    style="?android:listSeparatorTextViewStyle"
    />

<Button
    android:id="@+id/crime_date"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginLeft="16dp"
    android:layout_marginRight="16dp"
    />

<CheckBox
    android:id="@+id/crime_solved"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginLeft="16dp"
    android:layout_marginRight="16dp"
    android:text="@string/crime_solved_label"
    />

Activity 托管片段:

import android.app.Fragment;
import android.app.FragmentManager;
import android.os.Bundle;
import android.support.v13.app.FragmentStatePagerAdapter;
import android.support.v4.app.FragmentActivity;
import android.support.v4.view.ViewPager;

import java.util.ArrayList;
import java.util.UUID;

public class CrimePagerActivity extends FragmentActivity {
private ViewPager mViewPager;
private ArrayList<Crime> mCrimes;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    mViewPager = new ViewPager(this);
    mViewPager.setId(R.id.viewpager);
    setContentView(mViewPager);

    mCrimes = CrimeLab.get(this).getCrimes();

    FragmentManager fm = getFragmentManager();
    mViewPager.setAdapter(new FragmentStatePagerAdapter(fm) {
        @Override
        public int getCount()   {
            return mCrimes.size();
        }

        @Override
        public Fragment getItem(int pos) {
            Crime crime = mCrimes.get(pos);
            return CrimeFragment.newInstance(crime.getId());
        }
    });

    UUID crimeId = (UUID)getIntent().getSerializableExtra(CrimeFragment.EXTRA_CRIME_ID);
    for (int i = 0; i < mCrimes.size(); i++)    {
        if (mCrimes.get(i).getId().equals(crimeId)) {
            mViewPager.setCurrentItem(i);
            break;
        }
    }

    mViewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        public void onPageScrollStateChanged(int state)    {}

        public void onPageScrolled(int pos, float posOffset, int posOffsetPixels)  {}

        public void onPageSelected(int pos)    {
            Crime crime = mCrimes.get(pos);
            if (crime.getTitle() != null)   {
                setTitle(crime.getTitle());
            }
        }
    });
}
}

清单:

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

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
        android:name=".CrimeListActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN"   />
            <category android:name="android.intent.category.LAUNCHER"   />
        </intent-filter>
    </activity>
       <activity
        android:name=".CrimePagerActivity"
        android:label="@string/app_name" >
           <meta-data android:name="android.support.PARENT_ACTIVITY"
                      android:value=".CrimeListActivity"/>
    </activity>
</application>

res/styles:

<resources>

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

NPE 堆栈跟踪 1:

Process: com.bignerdranch.android.criminalintent, PID: 24448
java.lang.NullPointerException
        at com.bignerdranch.android.criminalintent.CrimeFragment.onCreateView(CrimeFragment.java:57)
        at android.app.Fragment.performCreateView(Fragment.java:1700)
        at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:890)
        at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1062)
        at android.app.BackStackRecord.run(BackStackRecord.java:684)
        at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1453)
        at android.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:479)
        at android.support.v13.app.FragmentStatePagerAdapter.finishUpdate(FragmentStatePagerAdapter.java:167)
        at android.support.v4.view.ViewPager.populate(ViewPager.java:1073)
        at android.support.v4.view.ViewPager.populate(ViewPager.java:919)
        at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1441)
        at android.view.View.measure(View.java:17495)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5363)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
        at android.view.View.measure(View.java:17495)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5363)
        at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1410)
        at android.widget.LinearLayout.measureVertical(LinearLayout.java:695)
        at android.widget.LinearLayout.onMeasure(LinearLayout.java:588)
        at android.view.View.measure(View.java:17495)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5363)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
        at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2548)
        at android.view.View.measure(View.java:17495)
        at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2285)
        at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1396)
        at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1595)
        at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1254)
        at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6632)
        at android.view.Choreographer$CallbackRecord.run(Choreographer.java:814)
        at android.view.Choreographer.doCallbacks(Choreographer.java:614)
        at android.view.Choreographer.doFrame(Choreographer.java:584)
        at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:800)
        at android.os.Handler.handleCallback(Handler.java:733)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:146)
        at android.app.ActivityThread.main(ActivityThread.java:5487)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:515)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1283)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099)
        at dalvik.system.NativeStart.main(Native Method)

when I call getActivity().getActionBar().setDisplayHomeAsUpEnabled(true), the app throws a nullPointerException.

当您调用此函数并告诉自己您的 Fragment 中有 ActionBar 而不是 Activity 时,您如何 运行 此命令。

I've tried using getActionBar.show() and setting the theme to Theme.Holo.Light, as suggested here. getActionBar.show()

该示例已过时,不再有 Holo 主题或 ActionBar。现在有Toolbar

CrimePagerActivity 可能想要扩展 ActionBarActivity 而不是 FragmentActivity。