2017-05-24 162 views
0

調試問題這是主要活動我的Java代碼:與片段佈局

package com.jcc.javier.navegacioncajon; 


    import android.app.Activity; 
    import android.support.v4.app.Fragment; 
    import android.app.FragmentTransaction; 
    import android.support.v4.app.FragmentManager; 
    import android.support.v4.app.FragmentActivity; 
    import android.os.Bundle; 
    import android.support.design.widget.FloatingActionButton; 
    import android.support.design.widget.Snackbar; 
    import android.support.v4.widget.DrawerLayout; 
    import android.support.v7.app.ActionBar; 
    import android.support.v7.app.ActionBarActivity; 
    import android.support.v7.app.AppCompatActivity; 
    import android.support.v7.widget.Toolbar; 
    import android.view.LayoutInflater; 
    import android.view.View; 
    import android.view.Menu; 
    import android.view.MenuItem; 
    import android.view.ViewGroup; 
    import android.widget.TextView; 

    public class MainActivity extends AppCompatActivity implements 
    Cajon.NavegationDrawerCallbacks { 

private Cajon mNavigationDrawerFragment; 
private CharSequence mTitle; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    mNavigationDrawerFragment = (Cajon) getSupportFragmentManager().findFragmentById(R.id.navegacionCajon); 
    mTitle = getTitle(); 
    mNavigationDrawerFragment.setUp(R.id.navegacionCajon, (DrawerLayout) findViewById(R.id.cajon_layout)); 

} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.main, menu); 
    restoreActionBar(); 
    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. 
    int id = item.getItemId(); 

    //noinspection SimplifiableIfStatement 
    if (id == R.id.action_settings) { 
     return true; 
    } 

    return super.onOptionsItemSelected(item); 
} 

public static class PlaceholderFragment extends Fragment { 

    private static final String ARG_SECTION_NUMBER="numero_Seccion"; 


    public PlaceholderFragment() { 
    } 

    public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) { 
     View rootView = inflater.inflate(R.layout.fragment_main, container, false); 
     TextView textView = (TextView) rootView.findViewById(R.id.seccion); 
     textView.setText("Este es el contenido de la seccion " + Integer.toString(getArguments().getInt(ARG_SECTION_NUMBER))); 
     return rootView; 
    } 

    public static PlaceholderFragment newInstance (int numeroseccion){ 
     PlaceholderFragment fragment = new PlaceholderFragment(); 
     Bundle args = new Bundle(); 
     args.putInt(ARG_SECTION_NUMBER, numeroseccion); 
     fragment.setArguments(args); 
     return fragment; 
    } 

    @Override 
    public void onAttach(Activity activity) { 
     super.onAttach(activity); 
     ((MainActivity)activity).onSectionAttached(getArguments().getInt(ARG_SECTION_NUMBER)); 
    } 
} 

@Override 
public void onNavigationDrawerItemSelected(int position) { 

    FragmentManager fragmentManager = getSupportFragmentManager(); 
    fragmentManager.beginTransaction().replace(R.id.container, PlaceholderFragment.newInstance(position+1)).commit(); 

} 

public void onSectionAttached (int number){ 
    switch (number){ 
     case 1: 
      mTitle = getString(R.string.seccion1); 
      break; 
     case 2: 
      mTitle = getString(R.string.seccion2); 
      break; 
     case 3: 
      mTitle = getString(R.string.seccion3); 
      break; 
    } 
} 

public void restoreActionBar(){ 
    ActionBar actionBar = getSupportActionBar(); 
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD); 
    actionBar.setDisplayShowTitleEnabled(true); 
    actionBar.setTitle(mTitle); 

} 
    } 

這是Cajon.java我的代碼的Java:

package com.jcc.javier.navegacioncajon; 

    import android.app.Activity; 
    import android.content.Context; 
    import android.content.SharedPreferences; 
    import android.content.res.Configuration; 
    import android.app.FragmentTransaction; 
    import android.os.Bundle; 
    import android.preference.Preference; 
    import android.preference.PreferenceManager; 
    import android.support.annotation.Nullable; 
    import android.support.v4.app.Fragment; 
    import android.support.v4.view.GravityCompat; 
    import android.support.v4.widget.DrawerLayout; 
    import android.support.v7.app.ActionBar; 
    import android.support.v4.app.ActionBarDrawerToggle; 
    import android.support.v7.app.ActionBarActivity; 
    import android.support.v7.app.AppCompatActivity; 
    import android.support.v7.widget.Toolbar; 
    import android.view.LayoutInflater; 
    import android.view.Menu; 
    import android.view.MenuInflater; 
    import android.view.MenuItem; 
    import android.view.View; 
    import android.view.ViewGroup; 
    import android.widget.AdapterView; 
    import android.widget.ArrayAdapter; 
    import android.widget.ListView; 
    import android.widget.Toast; 

    import java.util.zip.Inflater; 

    /** 
    * Created by JAVIER on 05/05/2017. 
    */ 

    public class Cajon extends Fragment { 

/**Interface para apuntador **/ 
public static interface NavegationDrawerCallbacks { 

    void onNavigationDrawerItemSelected(int position); 

} 

private static final String STATE_SELECTED_POSITION="selected_navigation_drawer_position"; 

private static final String PREF_USER_LEARNED_DRAWER="navigation_drawer_learned"; 

private NavegationDrawerCallbacks mCallbacks; 
private ActionBarDrawerToggle mDrawerToggle; 
private DrawerLayout mDrawerLayout; 
private ListView mDrawerListView; 
private View mfragmentContainerView; 

private int mCurrentSelectedPosition = 0; 
private boolean mFromSavedInstanceState; 
private boolean mUserLearnedDrawer; 

/**Implementación de clase Cajon **/ 
public Cajon() { 
} 

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

    SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getActivity()); 
    mUserLearnedDrawer = sp.getBoolean(PREF_USER_LEARNED_DRAWER, false); 

    /**Validar si existe un valor en la instancia salvada **/ 
    if (savedInstanceState != null){ 
     mCurrentSelectedPosition = savedInstanceState.getInt(STATE_SELECTED_POSITION); 
     mFromSavedInstanceState = true; 
    } 
    //mDrawerLayout=null; 
    selectedItem(mCurrentSelectedPosition); 

} 

/**Metodo onActivityCreated **/ 
@Override 
public void onActivityCreated(Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 
    setHasOptionsMenu(true); 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    mDrawerListView = (ListView) inflater.inflate(R.layout.cajon, container,false); 
    mDrawerListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) { 
      selectedItem(position); 
     } 
    }); 
    mDrawerListView.setAdapter(new ArrayAdapter<String>(
      //getActivity(), 
      getSupportActionBar().getThemedContext(), 
      android.R.layout.simple_list_item_1, 
      android.R.id.text1, 
      new String[]{ 
        getString(R.string.seccion1), 
        getString(R.string.seccion2), 
        getString(R.string.seccion3), 
      })); 
    mDrawerListView.setItemChecked(mCurrentSelectedPosition, true); 
    return mDrawerListView; 
} 

public boolean isDrawerOpen(){ 
    return mDrawerLayout != null && mDrawerLayout.isDrawerOpen(mfragmentContainerView); 

} 

public void setUp(int fragmentId, DrawerLayout drawerLayout){ 
    mfragmentContainerView = getActivity().findViewById(fragmentId); 
    mDrawerLayout = drawerLayout; 
    /**Poner sombra **/ 
    mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START); 

    ActionBar actionBar = getSupportActionBar(); 
    actionBar.setDisplayHomeAsUpEnabled(true); 
    actionBar.setHomeButtonEnabled(true); 

    mDrawerToggle = new ActionBarDrawerToggle(
      getActivity(), 
      mDrawerLayout, 
      R.drawable.ic_drawer, 
      R.string.abrir_cajon_navegacion, 
      R.string.cerrar_cajon_navegacion 
    ) { 
     @Override 
     public void onDrawerOpened(View drawerView) { 
      super.onDrawerOpened(drawerView); 
      if(!isAdded()){ 
       return; 
      } 
      if(!mUserLearnedDrawer){ 
       mUserLearnedDrawer = true; 
       SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getActivity()); 
       sp.edit().putBoolean(PREF_USER_LEARNED_DRAWER, true).commit(); 
      } 
      getActivity().supportInvalidateOptionsMenu(); 
     } 

     @Override 
     public void onDrawerClosed(View drawerView) { 
      super.onDrawerClosed(drawerView); 
      if(!isAdded()){ 
       return; 
      } 
      getActivity().supportInvalidateOptionsMenu(); 
     } 
    }; 
    if(!mUserLearnedDrawer && !mFromSavedInstanceState){ 
     mDrawerLayout.openDrawer(mfragmentContainerView); 
    } 
    mDrawerLayout.post(new Runnable() { 

     @Override 
     public void run() { 
      mDrawerToggle.syncState(); 
     } 
    }); 
    mDrawerLayout.setDrawerListener(mDrawerToggle); 

} 

private ActionBar getSupportActionBar() { 
    return ((AppCompatActivity)getActivity()).getSupportActionBar(); 

} 

/**Metodo selectedItem **/ 
private void selectedItem(int position) { 
    mCurrentSelectedPosition = position; 
    if(mDrawerListView != null){ 
     mDrawerListView.setItemChecked(position, true); 
    } 
    if(mDrawerLayout != null){ 
     mDrawerLayout.closeDrawer(mfragmentContainerView); 
    } 
    if(mCallbacks != null){ 
     mCallbacks.onNavigationDrawerItemSelected(position); 
    } 
} 

@Override 
public String toString() { 
    return super.toString(); 
} 

@Override 
public void onAttach(Activity activity) { 
    super.onAttach(activity); 
    try { 
     mCallbacks = (NavegationDrawerCallbacks) activity; 
    } catch (ClassCastException e) { 
     throw new ClassCastException("Activity must implement Navigation NavigationDrawerCallbacks. "); 
    } 
} 
@Override 
public void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    outState.putInt(STATE_SELECTED_POSITION, mCurrentSelectedPosition); 
} 

@Override 
public void onDetach() { 
    super.onDetach(); 
    mCallbacks = null; 
} 

@Override 
public void setArguments(Bundle args) { 
    super.setArguments(args); 
} 

@Override 
public void onConfigurationChanged(Configuration newConfig) { 
    super.onConfigurationChanged(newConfig); 
    mDrawerToggle.onConfigurationChanged(newConfig); 
} 

@Override 
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
    super.onCreateOptionsMenu(menu, inflater); 
    if (mDrawerLayout != null && isDrawerOpen()) { 
     inflater.inflate(R.menu.global, menu); 
     showGlobalContextActionBar(); 
    } 
    super.onCreateOptionsMenu(menu, inflater); 
} 

private void showGlobalContextActionBar() { 
    ActionBar actionBar = getSupportActionBar(); 
    actionBar.setDisplayShowTitleEnabled(true); 
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD); 
    actionBar.setTitle(R.string.app_name); 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    if(mDrawerToggle.onOptionsItemSelected(item)){ 
     return true; 
    } 
    if(item.getItemId()==R.id.action_example){ 
     Toast.makeText(getActivity(), "Navegacion Cajon", Toast.LENGTH_LONG).show(); 
     return true; 
    } 
    return super.onOptionsItemSelected(item); 
} 

}

而這些的有我的.xml文件: MainActivity:

<?xml version="1.0" encoding="utf-8"?> 
    <android.support.v4.widget.DrawerLayout 
xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:id="@+id/cajon_layout" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
tools:context="com.jcc.javier.navegacioncajon.MainActivity" 
tools:ignore="MergeRootFrame"> 

<FrameLayout 
    android:id="@+id/container" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

</FrameLayout> 

    <fragment 
     android:id="@+id/navegacionCajon" 
     android:name = "com.jcc.javier.navegacioncajon.Cajon" 
     android:layout_width="@dimen/navegacionCajon" 
     android:layout_height="match_parent" 
     android:layout_gravity="start" 
     tools:layout="@layout/cajon" /> 


     </android.support.v4.widget.DrawerLayout> 

全球:

<?xml version="1.0" encoding="utf-8"?> 
    <menu xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto"> 
<item 
    android:id="@+id/action_settings" 
    android:orderInCategory="100" 
    android:title="@string/action_settings" 
    app:showAsAction="never" /> 
    </menu> 

主要:

<menu xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    tools:context="com.jcc.javier.navegacioncajon.MainActivity"> 
    <item 
    android:id="@+id/action_settings" 
    android:orderInCategory="100" 
    android:title="@string/action_settings" 
    app:showAsAction="never" /> 
    <item 
    android:id="@+id/action_example" 
    android:title="@string/action_example" 
    app:showAsAction="ifRoom|withText"></item> 

    </menu> 

片段主:

<?xml version="1.0" encoding="utf-8"?> 
    <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" 
android:background="#81F79F" 
android:paddingBottom="@dimen/activity_vertical_margin" 
android:paddingLeft="@dimen/activity_horizontal_margin" 
android:paddingRight="@dimen/activity_horizontal_margin" 
android:paddingTop="@dimen/activity_vertical_margin" 
tools:context="com.jcc.javier.navegacioncajon.MainActivity$PlaceholderFragment"> 

<TextView 
    android:id="@+id/seccion" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="@string/hello_world" 
    android:textSize="20sp" /> 

<TextView 
    android:id="@+id/textView" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_centerHorizontal="true" 
    android:layout_centerVertical="true" 
    android:text="Contenido" 
    android:textAppearance="?android:attr/textAppearanceMedium" /> 

    </RelativeLayout> 

卡洪:

<?xml version="1.0" encoding="utf-8"?> 
    <ListView xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:background="#008FFF"> 

    </ListView> 

和我的logcat顯示這樣的信息:

05-24 21:36:50.374 3881-3881/com.jcc.javier.navegacioncajon 
    E/AndroidRuntime: FATAL EXCEPTION: main 
                      Process: com.jcc.javier.navegacioncajon, PID: 3881 
                      java.lang.RuntimeException: Unable to start activity ComponentInfo{com.jcc.javier.navegacioncajon/com.jcc.javier.navegacioncajon.MainActivity}: android.view.InflateException: Binary XML file line #18: Binary XML file line #18: Error inflating class fragment 
                       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2665) 
                       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2726) 
                       at android.app.ActivityThread.-wrap12(ActivityThread.java) 
                       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1477) 
                       at android.os.Handler.dispatchMessage(Handler.java:102) 
                       at android.os.Looper.loop(Looper.java:154) 
                       at android.app.ActivityThread.main(ActivityThread.java:6119) 
                       at java.lang.reflect.Method.invoke(Native Method) 
                       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886) 
                       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776) 
                      Caused by: android.view.InflateException: Binary XML file line #18: Binary XML file line #18: Error inflating class fragment 
                      Caused by: android.view.InflateException: Binary XML file line #18: Error inflating class fragment 
                      Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.Context android.support.v7.app.ActionBar.getThemedContext()' on a null object reference 
                       at com.jcc.javier.navegacioncajon.Cajon.onCreateView(Cajon.java:100) 
                       at android.support.v4.app.Fragment.performCreateView(Fragment.java:2192) 
                       at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1255) 
                       at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1472) 
                       at android.support.v4.app.FragmentManagerImpl.addFragment(FragmentManager.java:1691) 
                       at android.support.v4.app.FragmentManagerImpl.onCreateView(FragmentManager.java:3440) 
                       at android.support.v4.app.FragmentController.onCreateView(FragmentController.java:120) 
                       at android.support.v4.app.FragmentActivity.dispatchFragmentsOnCreateView(FragmentActivity.java:378) 
                       at android.support.v4.app.BaseFragmentActivityHoneycomb.onCreateView(BaseFragmentActivityHoneycomb.java:33) 
                       at android.support.v4.app.FragmentActivity.onCreateView(FragmentActivity.java:79) 
                       at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:777) 
                       at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:727) 
                       at android.view.LayoutInflater.rInflate(LayoutInflater.java:858) 
                       at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:821) 
                       at android.view.LayoutInflater.inflate(LayoutInflater.java:518) 
                       at android.view.LayoutInflater.inflate(LayoutInflater.java:426) 
                       at android.view.LayoutInflater.inflate(LayoutInflater.java:377) 
                       at android.support.v7.app.AppCompatDelegateImplV9.setContentView(AppCompatDelegateImplV9.java:292) 
                       at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:140) 
                       at com.jcc.javier.navegacioncajon.MainActivity.onCreate(MainActivity.java:32) 
                       at android.app.Activity.performCreate(Activity.java:6679) 
                       at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118) 
                       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2618) 
                       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2726) 
                       at android.app.ActivityThread.-wrap12(ActivityThread.java) 
                       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1477) 
                       at android.os.Handler.dispatchMessage(Handler.java:102) 
                       at android.os.Looper.loop(Looper.java:154) 
                       at android.app.ActivityThread.main(ActivityThread.java:6119) 
                       at java.lang.reflect.Method.invoke(Native Method) 
                       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886) 
                       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776) 

我需要解決這個錯誤,因爲我無法運行我的應用程序。

回答

0

getSupportActionBar()返回null。確保您的活動使用的是提供ActionBar(AppCompat主題)的主題,或者在MainActivity.onCreate()中使用setSupportActionBar(toolbar)

+0

我如何使用這行setSupportActionBar(工具欄)? –

+0

我可以找到答案,刪除它解決了這個代碼在Manifest.xml中爲我工作。 android:theme =「@ style/AppTheme.NoActionBar」 –

0

更改此:

mDrawerListView.setAdapter(new ArrayAdapter<String>(
      getActionBar().getThemedContext() 

要:

mDrawerListView.setAdapter(new ArrayAdapter<String>(
      getActivity(),