2017-09-18 22 views
0

我想提出我的项目作为networking.I我udacity课程的一部分,正在错误的(在com.example.android.flavor.MainActivity.onCreate(MainActivity.java:54)). 我不知道如何解决这一个。尝试在书籍清单应用程序项目中的空对象引用上调用虚拟方法?

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

要在一个活动中接收一个Bundle,这意味着当你启动这个活动时,你必须将该Bundle添加到这个Intent中。您必须手动指定要传递给起始活动的内容。阅读你的文章,我可以想象你的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。你必须改变你的发射活动如下:

<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"); 
} 

,或者如果你逝去的捆绑做的并不正确

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

现在我得到一个错误初始化searchQuery.Any其他建议? – Vishal

0

这是我的活动时,它是launched.Sorry我是新来这个,这就是为什么我加入这里。

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); 
     } 
    }); 
相关问题