2016-03-22 11 views
1

Hallo Ich bin neu in Android, ich bin derzeit versucht, von meiner MainActivity zu einer TabbedActivity zu navigieren. Ich habe eine neue TabbedActivity mithilfe der Standardvorlage für Tabbed Activity in der Galerie in Android Studio erstellt.Registerkarte Aktivität funktioniert nicht, verursacht App zum Absturz

Jedoch nachdem ich die Dateien erstellt hatte, überprüfte ich den Code und sah, dass viele Codezeilen, die beim Erstellen der Aktivität verwendet wurden, durchgestrichen waren, was bedeutete, dass sie veraltet waren.

Ich habe versucht, die App zu laufen, es funktionierte, bis ich versuchte, zu dieser Tabbed-Aktivität zu navigieren, dann stürzte es ab und warf einen Fehler in meinem Android Monitor.

FATAL EXCEPTION: main 
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.xxxxxx.eventmanager/com.xxxxxx.eventmanager.EventDetailsActivity}: java.lang.NullPointerException 
     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2059) 
     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084) 
     at android.app.ActivityThread.access$600(ActivityThread.java:130) 
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195) 
     at android.os.Handler.dispatchMessage(Handler.java:99) 
     at android.os.Looper.loop(Looper.java:137) 
     at android.app.ActivityThread.main(ActivityThread.java:4745) 
     at java.lang.reflect.Method.invokeNative(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:511) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
     at dalvik.system.NativeStart.main(Native Method) 
     Caused by: java.lang.NullPointerException 
     at com.xxxxxx.eventmanager.EventDetailsActivity.onCreate(EventDetailsActivity.java:42) 
     at android.app.Activity.performCreate(Activity.java:5008) 
     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079) 
     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023) 
     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)  
     at android.app.ActivityThread.access$600(ActivityThread.java:130)  
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195)  
     at android.os.Handler.dispatchMessage(Handler.java:99)  
     at android.os.Looper.loop(Looper.java:137)  
     at android.app.ActivityThread.main(ActivityThread.java:4745)  
     at java.lang.reflect.Method.invokeNative(Native Method)  
     at java.lang.reflect.Method.invoke(Method.java:511)  
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)  
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)  
     at dalvik.system.NativeStart.main(Native Method)  

Dies ist meine Tabbed-Aktivität namens EventDetailsActivity. Ich habe keine benutzerdefinierten Code oder Änderungen vorgenommen, um den Standardcode hinzugefügt, der auf erstellen generiert wurde:

package com.xxxxxx.eventmanager; 


import android.app.Activity; 
import android.app.ActionBar; 
import android.app.FragmentTransaction; 

import android.app.Fragment; 
import android.app.FragmentManager; 
import android.support.v13.app.FragmentPagerAdapter; 
import android.support.v4.view.ViewPager; 
import android.os.Bundle; 
import android.view.LayoutInflater; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.view.ViewGroup; 

import android.widget.TextView; 

public class EventDetailsActivity extends Activity implements ActionBar.TabListener { 

    /** 
    * The {@link android.support.v4.view.PagerAdapter} that will provide 
    * fragments for each of the sections. We use a 
    * {@link FragmentPagerAdapter} derivative, which will keep every 
    * loaded fragment in memory. If this becomes too memory intensive, it 
    * may be best to switch to a 
    * {@link android.support.v13.app.FragmentStatePagerAdapter}. 
    */ 
    private SectionsPagerAdapter mSectionsPagerAdapter; 

    /** 
    * The {@link ViewPager} that will host the section contents. 
    */ 
    private ViewPager mViewPager; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_event_details); 
     getActionBar().setDisplayHomeAsUpEnabled(true); 
     // Create the adapter that will return a fragment for each of the three 
     // primary sections of the activity. 
     mSectionsPagerAdapter = new SectionsPagerAdapter(getFragmentManager()); 

     // Set up the ViewPager with the sections adapter. 
     mViewPager = (ViewPager) findViewById(R.id.container); 
     mViewPager.setAdapter(mSectionsPagerAdapter); 


     // Set up the action bar. 
     final ActionBar actionBar = getActionBar(); 
     actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 

     // When swiping between different sections, select the corresponding 
     // tab. We can also use ActionBar.Tab#select() to do this if we have 
     // a reference to the Tab. 
     mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() { 
      @Override 
      public void onPageSelected(int position) { 
       actionBar.setSelectedNavigationItem(position); 
      } 
     }); 

     // For each of the sections in the app, add a tab to the action bar. 
     for (int i = 0; i < mSectionsPagerAdapter.getCount(); i++) { 
      // Create a tab with text corresponding to the page title defined by 
      // the adapter. Also specify this Activity object, which implements 
      // the TabListener interface, as the callback (listener) for when 
      // this tab is selected. 
      actionBar.addTab(
        actionBar.newTab() 
          .setText(mSectionsPagerAdapter.getPageTitle(i)) 
          .setTabListener(this)); 
     } 

    } 


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

    @Override 
    public void onTabSelected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) { 
     // When the given tab is selected, switch to the corresponding page in 
     // the ViewPager. 
     mViewPager.setCurrentItem(tab.getPosition()); 
    } 

    @Override 
    public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) { 
    } 

    @Override 
    public void onTabReselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) { 
    } 

    /** 
    * A placeholder fragment containing a simple view. 
    */ 
    public static class PlaceholderFragment extends Fragment { 
     /** 
     * The fragment argument representing the section number for this 
     * fragment. 
     */ 
     private static final String ARG_SECTION_NUMBER = "section_number"; 

     public PlaceholderFragment() { 
     } 

     /** 
     * Returns a new instance of this fragment for the given section 
     * number. 
     */ 
     public static PlaceholderFragment newInstance(int sectionNumber) { 
      PlaceholderFragment fragment = new PlaceholderFragment(); 
      Bundle args = new Bundle(); 
      args.putInt(ARG_SECTION_NUMBER, sectionNumber); 
      fragment.setArguments(args); 
      return fragment; 
     } 

     @Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, 
           Bundle savedInstanceState) { 
      View rootView = inflater.inflate(R.layout.fragment_event_details, container, false); 
      TextView textView = (TextView) rootView.findViewById(R.id.section_label); 
      textView.setText(getString(R.string.section_format, getArguments().getInt(ARG_SECTION_NUMBER))); 
      return rootView; 
     } 
    } 

    /** 
    * A {@link FragmentPagerAdapter} that returns a fragment corresponding to 
    * one of the sections/tabs/pages. 
    */ 
    public class SectionsPagerAdapter extends FragmentPagerAdapter { 

     public SectionsPagerAdapter(FragmentManager fm) { 
      super(fm); 
     } 

     @Override 
     public Fragment getItem(int position) { 
      // getItem is called to instantiate the fragment for the given page. 
      // Return a PlaceholderFragment (defined as a static inner class below). 
      return PlaceholderFragment.newInstance(position + 1); 
     } 

     @Override 
     public int getCount() { 
      // Show 3 total pages. 
      return 3; 
     } 

     @Override 
     public CharSequence getPageTitle(int position) { 
      switch (position) { 
       case 0: 
        return "SECTION 1"; 
       case 1: 
        return "SECTION 2"; 
       case 2: 
        return "SECTION 3"; 
      } 
      return null; 
     } 
    } 
} 

Ich bin neu in Java und Android und ganz durch diese verwirrt.

+0

Ich nehme an, Sie haben nicht die Symbolleiste (oder Aktionsleiste in alten Begriffen). Können Sie die Layoutdatei anhängen? – Alexey

Antwort

0

versuchen, diese Linie zu ändern

final ActionBar actionBar = getActionBar(); 

TO

final ActionBar actionBar = getSupportActionBar(); 
+0

Es gibt keine Methode wie "getSupportedActionBar" in meiner Aktivität, wenn ich es versuche. – user3718908

+0

erweiterte Klasse 'Activity' in' ActionBarActivity' ändern – Amy

+0

Tatsächlich Methodenaufrufe 'getSupportActionBar', nicht' getSupportedActionBar' – Alexey

0

Verwendung extends AppCompatActivity und Verwendung als die Symbolleiste verwenden ..

private void setup_tabs(){ 
     pager = (CustomViewPager)findViewById(R.id.viewpager); 
     pager.setOffscreenPageLimit(3); 
     adapter = new Tabs_Pager_adapter(getSupportFragmentManager(),this); 
     pager.setAdapter(adapter); 

     pager.setPagingEnabled(true); 
//  Title.setText(adapter.getPageTitle(pager.getCurrentItem())); 

       tabLayout = (TabLayout) findViewById(R.id.tabs); 

      // tabLayout.addTab(tabLayout.newTab().setText("Home")); 
       tabLayout.addTab(tabLayout.newTab().setText("Respondents")); 
       tabLayout.addTab(tabLayout.newTab().setText("History")); 
       tabLayout.setupWithViewPager(pager); 

    } 

    private void setupToolbar(){ 
     toolbar = (Toolbar) findViewById(R.id.toolbar); 
     if(toolbar != null) 
      setSupportActionBar(toolbar); 

     // Show menu icon 
      final ActionBar ab = getSupportActionBar(); 
      ab.setDisplayHomeAsUpEnabled(true); 

      ab.setDisplayShowTitleEnabled(false); 

      toolbar.setNavigationIcon(R.drawable.ic_action_back); 
      toolbar.setNavigationOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        finish(); 
       } 
      }); 

    } 

Und in Ihrem Layout ..

<LinearLayout 
    android:layout_weight=".75" 
    android:layout_width="match_parent" 
    android:layout_height="0dp" 
    android:orientation="vertical" > 

    <android.support.design.widget.TabLayout 
     android:id="@+id/tabs" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     app:tabGravity="fill" 
     app:tabMode="fixed"/> 

    <your.view.ViewPager 
     android:id="@+id/viewpager" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" /> 



</LinearLayout> 

Und das ist das Thema ..

<style name="Base.Theme.your_theme" parent="Theme.AppCompat.Light.NoActionBar"> 

     <item name="colorPrimary">@color/my_primary</item> 
     <item name="colorPrimaryDark">@color/my_primary_dark</item> 
     <item name="colorAccent">@color/my_accent</item> 
    </style> 

Verwenden Sie die App compat Bibliothek mit Android Support-Bibliothek ... und mit Design-Support-Bibliothek .. es ist genial. Verwenden Sie das Tooolbar-Layout in Ihrem layout.xml und legen Sie das Thema mit appcompat ohne Aktionsleiste fest.

+0

Ich benutze AppCompatActivity, ich habe es nur geändert, aber das löst mein Problem auch nicht Ich sehe nichts im Zusammenhang mit Tabs in Ihrem Code. – user3718908

+0

Ihr Problem mit der Symbolleiste .. als ich sehe den Fehler. –

+0

sehen Sie den bearbeiteten Code, finden Sie beide, Toolbar und Tab-Layout. –

0

Wie behandle ich mit Symbolleiste in meiner App (zum Beispiel).

In meiner Tätigkeit Layout XML-Datei:

<LinearLayout 
    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:orientation="vertical"> 

<include layout="@layout/toolbar" /> 
<!-- more xml code below --> 

Inhalt der toolbat.xml:

<android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:id="@+id/toolbar_actionbar" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:minHeight="?android:attr/actionBarSize" 
    app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" 
    app:popupTheme="@style/PopupMenuStyle" 
    android:background="@color/bar_color"> 

    <!-- arbitrary components are in toolbar --> 

</android.support.v7.widget.Toolbar> 

Jetzt bereitete ich für die Symbolleiste in meiner App einrichten. In onCreate Verfahren muss ich vor mit Symbolleiste diesen Code verwenden:

Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar_actionbar); 
setSupportActionBar(toolbar); 

Seit diesem Moment ich getSupportActionBar() verwenden können, und es wird korrektes Ergebnis.

In Ihrem Fall können Sie setActionBar(toolbar) anstelle von setSupportActionBar(toolbar) und <android.widget.Toolbar statt <android.support.v7.widget.Toolbar in Ihrer Layout-Datei.

Verwandte Themen