2017-09-18 6 views
0

com.example.android.flavor.MainActivity.onCreate(MainActivity.java:54)). で、私はこの1つを解決する方法がわからない(でエラーを取得しています。ブックリストのアプリプロジェクトでヌルオブジェクト参照に対して仮想メソッドを呼び出そうとしていますか?私はnetworking.Iの私のudacityカリキュラムの一環として、私のプロジェクトを作っています

MainActivity.java

public class MainActivity extends AppCompatActivity implements LoaderManager.LoaderCallbacks<List<BookList>> { 
public static final String LOG_TAG = MainActivity.class.getName(); 

/** 
* Constant value for the Book loader ID. We can choose any integer. 
* This really only comes into play if you're using multiple loaders. 
*/ 
private Adapter mAdapter; 
private static final int BOOK_LOADER_ID = 1; 

private String GOOGLE_BOOK_URL; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    //Fetching the bundle from the searchbar activity 
    Bundle searchBundle = getIntent().getExtras(); 
    String searchQuery = searchBundle.getString("searchQuery"); 
    searchQuery = searchQuery.replaceAll("","+"); 
    Log.v("replace",searchQuery); 

    //Make a new String builder to produce URL 
    StringBuilder searchUrlBuilder = new StringBuilder(); 
    searchUrlBuilder.append("https://www.googleapis.com/books/v1/volumes?q=" + searchQuery + 
    "&maxResults= 20"); 
    Log.v("URL", String.valueOf(searchUrlBuilder)); 
    //GOOG...URL assumes value of searchUrlBuilder 
    GOOGLE_BOOK_URL = String.valueOf(searchUrlBuilder); 


    // Find a reference to the {@link ListView} in the layout 
    final ListView bookListView = (ListView) findViewById(R.id.listview_book); 

    // Create a new adapter that takes an empty list of earthquakes as input 
    mAdapter = new BookListAdapter(this, new ArrayList<BookList>()); 

    // Set the adapter on the {@link ListView} 
    // so the list can be populated in the user interface 
    bookListView.setAdapter((ListAdapter) mAdapter); 

    //Get a reference to the LoaderManager, in order to interact with loaders. 
    LoaderManager loaderManager = getLoaderManager(); 

    // Initialize the loader. Pass in the int ID constant defined above and pass in null for 
    // the bundle. Pass in this activity for the LoaderCallbacks parameter (which is valid 
    // because this activity implements the LoaderCallbacks interface). 
    loaderManager.initLoader(BOOK_LOADER_ID, null, this); 
} 

@Override 
public Loader<List<BookList>> onCreateLoader(int i, Bundle bundle) { 
    //Create a new Loader for the given URL this is where GOOGLE_BOOKS_REQUEST_URL was 
    return new BookLoader(this, GOOGLE_BOOK_URL); 
} 

@Override 
public void onLoadFinished(Loader<List<BookList>> loader, List<BookList> books) { 
    //Clear the adapter of previous data 
    books.clear(); 

    if (books != null && !books.isEmpty()) { 
     books.addAll(books); 
    } 
} 

@Override 
public void onLoaderReset(Loader<List<BookList>> loader) { 
    // Loader reset, so we can clear out our existing data. 

} 

}

Logcat:

enter code here 

09-18 17:05:58.961 23093-23093/com.example.android.flavor E/AndroidRuntime: FATAL EXCEPTION: main 
                      Process: com.example.android.flavor, PID: 23093 
                      java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.android.flavor/com.example.android.flavor.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.os.Bundle.getString(java.lang.String)' on a null object reference 
                       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2426) 
                       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2490) 
                       at android.app.ActivityThread.-wrap11(ActivityThread.java) 
                       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1354) 
                       at android.os.Handler.dispatchMessage(Handler.java:102) 
                       at android.os.Looper.loop(Looper.java:148) 
                       at android.app.ActivityThread.main(ActivityThread.java:5443) 
                       at java.lang.reflect.Method.invoke(Native Method) 
                       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728) 
                       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 
                      Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.os.Bundle.getString(java.lang.String)' on a null object reference 
                       at com.example.android.flavor.MainActivity.onCreate(MainActivity.java:54) 
                       at android.app.Activity.performCreate(Activity.java:6259) 
                       at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1130) 
                       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2379) 
                       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2490)  
                       at android.app.ActivityThread.-wrap11(ActivityThread.java)  
                       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1354)  
                       at android.os.Handler.dispatchMessage(Handler.java:102)  
                       at android.os.Looper.loop(Looper.java:148)  
                       at android.app.ActivityThread.main(ActivityThread.java:5443)  
+0

郵便番号、 – firegloves

+0

ねえ@fireglovesあなたはより具体的なことができ、私はあなたが求めているのか分からないようにしてください? – Vishal

+0

アクティビティでバンドルを受け取るには、このアクティビティを起動するときに、そのバンドルをインテントに追加する必要があることを意味します。開始アクティビティに渡すものを手動で指定する必要があります。あなたの記事を読んで、あなたのMainActivityがあなたの最初に始められた活動だと想像してもらえますか? – firegloves

答えて

0

を行ってくださいそれは意図に束ねる。開始アクティビティに渡すものを手動で指定する必要があります。あなたの記事を読んで、あなたのMainActivityがあなたの最初に始められた活動だと想像してもらえますか?

間違った方法は、あなたがあなたの活動に間違ったあなたのバンドルを渡しているバンドル

を渡します。これを試してみてください:

final Intent openResultActivity = new Intent(this,MainActivity.class); 
     final EditText searchQuery = (EditText) findViewById(R.id.search_edit_text); 

     Button searchButton=(Button)findViewById(R.id.search_button); 
     searchButton.setOnClickListener(new View.OnClickListener(){ 
      @Override 
      public void onClick(View v){ 
       final String searchQueryString=searchQuery.getText().toString(); 
       Log.v("SearchinSBA",searchQueryString); 

       Bundle bundle=new Bundle(); 
       bundle.putString("searchQuery",searchQueryString); 
       openResultActivity.putExtras(bundle); 
       startActivity(openResultActivity); 
      } 
     }); 

間違っLaunchActivity

私の最初の答えは正しかった:あなたはMainActivityから始まるあなたのアプリを起動しています。だからSearchBarActivityのコード(あなたはputStringなどを実行していた)は決して実行されません。そのコードは最初に実行されなければならないので、バンドルをMainActivityに渡すことができます。

あなたの問題はAndroidManifest.xmlにあります。あなたは次のようにあなたのランチャーの活動を変更する必要があります。それは私がここに追加してい理由です私はこれに新しいですlaunched.Sorryとき

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.example.android.flavor"> 

    <uses-permission android:name="android.permission.INTERNET" /> 

    <application 
     android:allowBackup="true" 
     android:icon="@mipmap/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme"> 
     <activity 
      android:name=".MainActivity" 
      android:label="@string/app_name"> 
     </activity> 
     <activity android:name=".SearchBarActivity"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
    </application> 

</manifest> 
+0

投稿で私の答えをチェックできますか? – Vishal

+0

https://github.com/Vishalux72/BookSearchApp – Vishal

+0

編集してもまだ機能しなかったのでそれを調べることはできますか? – Vishal

0

あなたはバンドルを受け取っていません。その方法

String searchQuery; 
if(searchBundle!=null){ 
    searchQuery = searchBundle.getString("searchQuery"); 
} 

アクセスする前にnullをチェックしたり、バンドルを渡している場合、誤って、それはあなたがこの活動を起動するときに追加しておく必要がありますことを意味し活動にバンドルを受信するには、この

Intent intent = new Intent(YourActivityName.this, MainActivity.class); 
Bundle bundle = new Bundle(); 
bundle.putString("searchQuery", yourSearchQuery); 
intent.putExtras(bundle); 
startActivity(intent); 
+0

これで、searchQueryを初期化する際にエラーが発生しました。 – Vishal

0

は、これが私の活動です。あなたは、文字列のバンドルを入れている

SearchBarActivity.java 

final Intent openResultActivity = new Intent(this,MainActivity.class); 

final EditText searchQuery = (EditText) findViewById(R.id.search_edit_text); 

Button searchButton = (Button) findViewById(R.id.search_button); 
    searchButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      final String searchQueryString = searchQuery.getText().toString(); 
      Log.v("SearchinSBA",searchQueryString); 
      openResultActivity.putExtra("searchQuery",searchQueryString); 
      startActivity(openResultActivity); 
     } 
    }); 
関連する問題