2017-04-12 107 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); 

該應用程序崩潰,因爲你是第一次設置視圖,然後設置工具欄。

相關問題