关于 android:Action Bar 不显示

Action Bar not Displaying

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

我已经尝试使用 getActionBar.show() 并将主题设置为 Theme.Holo.Light,如此处建议的那样。 getActionBar.show(),但这会导致应用程序崩溃并产生 nullPointerException。当我尝试使用 Theme.Holo.Light 时,它告诉我我必须使用 appcompat 主题("您需要在此活动中使用 Theme.AppCompat 主题(或后代)。")

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

不会显示操作栏的片段:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
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:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
<?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"
    />

活动托管片段:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
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());
            }
        }
    });
}
}

清单:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?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>
           
            <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>

分辨率/样式:

1
2
3
4
5
6
<resources>

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

NPE 堆栈跟踪 1:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
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)


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


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 Theme 或 ActionBar。现在有 Toolbar