2015-09-22 4 views
1

Я пытаюсь поместить вверх кнопку на моей панели действий, но мое приложение не отображает панель действий для фрагмента. Мой фрагмент основного действия имеет панель действий, а не фрагмент, который он запускает, поэтому, когда я вызываю getActivity().getActionBar().setDisplayHomeAsUpEnabled(true), приложение выдает исключение nullPointerException. (Трассировка стека для этого ниже на трассе NPE Stack Trace 1).Панель действий не отображается

Я пробовал использовать getActionBar.show() и установил тему Theme.Holo.Light, как предложено here. getActionBar.show(), но это приводит к сбою приложения с помощью исключения nullPointerException. Когда я пытаюсь использовать Theme.Holo.Light, он говорит мне, что мне нужно использовать тему appcompat («Вы должны использовать тему Theme.PpCompat (или потомка) с этим действием.»)

Я посмотрел вокруг, как исправить эту ошибку, но ни одна из тем 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" 
    /> 

активность хостинг фрагмент:

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> 

разреш/стили:

<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) 
+0

Опубликуйте свои файлы макета XML вашей деятельности и фрагмента, а также свой класс активности, где вы должны установить свой ActionBar. – Sharj

+0

Добавили те. Спасибо, что посмотрели! – Dennis

+0

Ваш код очень старый. Вам нужно познакомиться с новыми API.Например, расширьте свою деятельность с помощью класса AppCompatActivity, поскольку вы используете тему AppCompat. – Sharj

ответ

0

CrimePagerActivity, вероятно, хочет расширить ActionBarActivity, а не FragmentActivity.

0

, когда я называю getActivity().getActionBar().setDisplayHomeAsUpEnabled(true), приложение выбрасывает исключение nullPointerException.

Когда вы вызываете эту функцию и говорите себе, что у вас есть ActionBar в своем фрагменте, а не в вашей деятельности, то как вы можете запустить эту команду.

Я попытался использовать getActionBar.show() и установил тему Theme.Holo.Light, как предлагается здесь. getActionBar.show()

Этот пример устарел и больше нет темы Голо или ActionBar. Сейчас Toolbar.

Смежные вопросы