2017-04-12 142 views
1

我是Android开发新手,我正在尝试为我的课程中的某个项目创建一种类型的应用程序。教授最喜欢的座右铭是“无论你不知道谷歌它”。当你半知道该怎么做时,这并不坏,但是因为我们正在学习java和android开发,所以这没什么帮助,因为java看起来有点陌生。在模拟器中启动时发生应用程序崩溃

不管怎么说立足我的应用程序中的联系人应用程序,这是我的MainActivity外观

//MainActivity.java 
package com.iekproject.siegfried.libraryapp; 

import android.net.Uri; 
import android.os.Bundle; 
import android.os.Environment; 
import android.support.v4.app.FragmentTransaction; 
import android.support.v7.app.AppCompatActivity; 
import android.support.v7.widget.Toolbar; 

public class MainActivity extends AppCompatActivity 
    implements LibraryFragment.LibraryFragmentListener, DetailFragment.DetailFragmentListener, 
    AddEditFragment.AddEditFragmentListener { 

//key for storing a book's Uri in a Bundle passed to a fragment 
public static final String BOOK_URI = "book_uri"; 

private LibraryFragment libraryFragment; //displays library aka book list 

//displays LibraryFragment when MainActivity first loads 
@Override 
protected void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 

    //if layout contains fragmentContainer, the phone layout is in use. Create and display 
    //a LibraryFragment 
    if (savedInstanceState == null && findViewById(R.id.fragmentContainer) != null) { 
     //create LibraryFragment 
     libraryFragment = new LibraryFragment(); 

     //add the fragment to the FrameLayout 
     FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); 
     transaction.add(R.id.fragmentContainer, libraryFragment); 
     transaction.commit(); //displays LibraryFragment 
    } 
    else { 
     libraryFragment = 
       (LibraryFragment) getSupportFragmentManager(). 
         findFragmentById(R.id.DetailFragment); 
    } 
} 

public boolean isExternalStorageReadable() { 
    String state = Environment.getExternalStorageState(); 
    if (Environment.MEDIA_MOUNTED.equals(state) || 
      Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) { 
     return true; 
    } 
    return false; 
} 

//displays DetailFragment for selected book 
@Override 
public void onBookSelected(Uri bookUri) { 
     getSupportFragmentManager().popBackStack(); 
     displayBook(bookUri, R.id.rightPaneContainer); 
} 

//displays AddEditFragment to add a new book. Possibly what I'll also have to change to make it 
//scan/update the book list 
@Override 
public void onAddBook() { 
     displayAddEditFragment(R.id.rightPaneContainer, null); 
} 

//displays a book 
private void displayBook(Uri bookUri, int viewID) { 
    DetailFragment detailFragment = new DetailFragment(); 

    //specify book's Uri as an argument to the DetailFragment 
    Bundle arguments = new Bundle(); 
    arguments.putParcelable(BOOK_URI, bookUri); 
    detailFragment.setArguments(arguments); 

    //use a FragmentTransaction to display the DetailFragment 
    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); 
    transaction.replace(viewID, detailFragment); 
    transaction.addToBackStack(null); 
    transaction.commit(); //causes DetailFragment to display 
} 

//displays fragment for adding new or editing existing book 
private void displayAddEditFragment(int viewID, Uri bookUri) { 
    AddEditFragment addEditFragment = new AddEditFragment(); 

    //if editing existing book, provide bookUri as an argument 
    if (bookUri != null) { 
     Bundle arguments = new Bundle(); 
     arguments.putParcelable(BOOK_URI, bookUri); 
     addEditFragment.setArguments(arguments); 
    } 

    //use a FragmentTransaction to display the AddEditFragment 
    FragmentTransaction transaction = 
      getSupportFragmentManager().beginTransaction(); 
    transaction.replace(viewID, addEditFragment); 
    transaction.addToBackStack(null); 
    transaction.commit(); //causes AddEditFragment to display 
} 

//return to book list when displayed book deleted 
@Override 
public void onBookDeleted() { 
    //removes top of back stack 
    getSupportFragmentManager().popBackStack(); 
    libraryFragment.updateLibrary(); //refresh book list 
} 

//displays the AddEditFragment to edit an existing book. Maybe it can be used as Move or sth 
/*@Override 
public void onEditBook(Uri bookUri) { 
    displayAddEditFragment(R.id.rightPaneContainer, bookUri); 
}*/ 

//update GUI after the new book or updated book saved 
@Override 
public void onAddEditCompleted(Uri bookUri) { 
    //removes top of back stack 
    getSupportFragmentManager().popBackStack(); 
    libraryFragment.updateLibrary(); //refresh book list 

    if (findViewById(R.id.fragmentContainer) == null){ //tablet 
     //removes top of back stack 
     getSupportFragmentManager().popBackStack(); 

     //on tablet, displays the book that was just added or edited 
     displayBook(bookUri, R.id.rightPaneContainer); 
    } 
    } 
} 

,这是logcat的

04-12 16:14:38.807 5796-5796/? I/art: Not late-enabling -Xcheck:jni (already on) 
04-12 16:14:38.808 5796-5796/? W/art: Unexpected CPU variant for X86 using defaults: x86 
04-12 16:14:38.926 5796-5796/com.iekproject.siegfried.libraryapp W/System: ClassLoader referenced unknown path: /data/app/com.iekproject.siegfried.libraryapp-1/lib/x86 
04-12 16:14:38.945 5796-5796/com.iekproject.siegfried.libraryapp I/InstantRun: starting instant run server: is main process 
04-12 16:14:38.991 5796-5796/com.iekproject.siegfried.libraryapp W/art: Before Android 4.1, method android.graphics.PorterDuffColorFilter android.support.graphics.drawable.VectorDrawableCompat.updateTintFilter(android.graphics.PorterDuffColorFilter, android.content.res.ColorStateList, android.graphics.PorterDuff$Mode) would have incorrectly overridden the package-private method in android.graphics.drawable.Drawable 
04-12 16:14:39.119 5796-5796/com.iekproject.siegfried.libraryapp D/AndroidRuntime: Shutting down VM 
04-12 16:14:39.119 5796-5796/com.iekproject.siegfried.libraryapp E/AndroidRuntime: FATAL EXCEPTION: main 
                        Process: com.iekproject.siegfried.libraryapp, PID: 5796 
                        java.lang.RuntimeException: Unable to start activity ComponentInfo{com.iekproject.siegfried.libraryapp/com.iekproject.siegfried.libraryapp.MainActivity}: java.lang.IllegalStateException: This Activity already has an action bar supplied by the window decor. Do not request Window.FEATURE_SUPPORT_ACTION_BAR and set windowActionBar to false in your theme to use a Toolbar instead. 
                         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: java.lang.IllegalStateException: This Activity already has an action bar supplied by the window decor. Do not request Window.FEATURE_SUPPORT_ACTION_BAR and set windowActionBar to false in your theme to use a Toolbar instead. 
                         at android.support.v7.app.AppCompatDelegateImplV9.setSupportActionBar(AppCompatDelegateImplV9.java:207) 
                         at android.support.v7.app.AppCompatActivity.setSupportActionBar(AppCompatActivity.java:130) 
                         at com.iekproject.siegfried.libraryapp.MainActivity.onCreate(MainActivity.java:30) 
                         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)  

任何帮助表示赞赏

+2

从您的LC:'不要求Window.FEATURE_SUPPORT_ACTION_BAR并在您的主题中将windowActionBar设置为false以代替使用工具栏。' – statosdotcom

+0

谢谢。修复,但它仍然崩溃... 编辑:不得不删除 工具栏工具栏=(工具栏)findViewById(R.id.toolbar); setSupportActionBar(toolbar); ,并使其工作,谢谢! –

+0

你已经找到了。不用谢我。保持它的男人。加1。 – statosdotcom

回答

0

你只需要设置设置工具栏后的内容视图。你可以这样写:

Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
setSupportActionBar(toolbar); 
setContentView(R.layout.activity_main); 

该应用程序崩溃,因为你是第一次设置视图,然后设置工具栏。