2014-04-25 74 views
1

我目前正在嘗試獲取Android的基本「我的第一個應用程序」教程(由Google創建)來工作,但我遇到了一些問題。目前,該應用程序是如何使沒有錯誤在Eclipse中顯示出來,但是當我運行的應用程序,並單擊發送按鈕,應用程序崩潰顯示Unfortunately, My First App has stopped.Android我的第一個應用程序教程android:onClick問題

尋找在日誌貓它指出了錯誤

java.lang.IllegalStateException: Could not find a method sendMessage(View) 
in the activity class com.example.myfirstapp.MainActivity for onClick handler 
on view class android.widget.Button. 

sendMessage確實存在於MainActivity類中,但它是函數PlaceholderFragment內的嵌套類。最初我以爲這是一個索引錯誤,所以我試圖調用sendMessage像嵌套類android:onClick="PlaceholderFragment.sendMessage"沒有成功。我已經包含了fragment_mainMainActivity類以及我的完整logcat錯誤。謝謝你的幫助。

MainActivity:

package com.example.myfirstapp; 

import android.content.Intent; 
import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.support.v7.app.ActionBarActivity; 
import android.view.LayoutInflater; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.EditText; 



public class MainActivity extends ActionBarActivity { 
    public final static String EXTRA_MESSAGE = "com.example.myfirstapp.MESSAGE"; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     if (savedInstanceState == null) { 
      getSupportFragmentManager().beginTransaction() 
        .add(R.id.container, new PlaceholderFragment()) 
        .commit(); 
     } 
    } 


    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 

     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.main, 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(); 
     if (id == R.id.action_settings) { 
      return true; 
     } 
     return super.onOptionsItemSelected(item); 
    } 

    /** 
    * A placeholder fragment containing a simple view. 
    */ 
    public static class PlaceholderFragment extends Fragment { 

     public PlaceholderFragment() { 
     } 

     @Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, 
       Bundle savedInstanceState) { 
      View rootView = inflater.inflate(R.layout.fragment_main, container, false); 
      return rootView; 
     } 
     /** Called when the user clicks the Send button */ 
     public void sendMessage(View view) { 
      Intent intent = new Intent(getActivity(), DisplayMessageActivity.class); 
      EditText editText = (EditText)getActivity(). findViewById(R.id.edit_message); 
      String message = editText.getText().toString(); 
      intent.putExtra(EXTRA_MESSAGE, message); 
      startActivity(intent); 
     } 

    } 

} 

片段主營:

<?xml version="1.0" encoding="utf-8"?> 
<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="horizontal"> 
    <EditText android:id="@+id/edit_message" 
     android:layout_weight="1" 
     android:layout_width="0dp" 
     android:layout_height="wrap_content" 
     android:hint="@string/edit_message" /> 
    <Button 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="@string/button_send" 
     android:onClick="sendMessage" /> 
</LinearLayout> 

的logcat:

04-25 12:04:07.220: D/(1274): HostConnection::get() New Host Connection established 0xb8e4f238, tid 1274 
04-25 12:04:07.330: W/EGL_emulation(1274): eglSurfaceAttrib not implemented 
04-25 12:04:07.340: D/OpenGLRenderer(1274): Enabling debug mode 0 
04-25 12:04:10.620: D/AndroidRuntime(1274): Shutting down VM 
04-25 12:04:10.620: W/dalvikvm(1274): threadid=1: thread exiting with uncaught exception (group=0xb2a6bba8) 
04-25 12:04:10.750: E/AndroidRuntime(1274): FATAL EXCEPTION: main 
04-25 12:04:10.750: E/AndroidRuntime(1274): Process: com.example.myfirstapp, PID: 1274 
04-25 12:04:10.750: E/AndroidRuntime(1274): java.lang.IllegalStateException: Could not find a method sendMessage(View) in the activity class com.example.myfirstapp.MainActivity for onClick handler on view class android.widget.Button 
04-25 12:04:10.750: E/AndroidRuntime(1274):  at android.view.View$1.onClick(View.java:3810) 
04-25 12:04:10.750: E/AndroidRuntime(1274):  at android.view.View.performClick(View.java:4438) 
04-25 12:04:10.750: E/AndroidRuntime(1274):  at  android.view.View$PerformClick.run(View.java:18422) 
04-25 12:04:10.750: E/AndroidRuntime(1274):  at android.os.Handler.handleCallback(Handler.java:733) 
04-25 12:04:10.750: E/AndroidRuntime(1274):  at android.os.Handler.dispatchMessage(Handler.java:95) 
04-25 12:04:10.750: E/AndroidRuntime(1274):  at android.os.Looper.loop(Looper.java:136) 
04-25 12:04:10.750: E/AndroidRuntime(1274):  at android.app.ActivityThread.main(ActivityThread.java:5017) 
04-25 12:04:10.750: E/AndroidRuntime(1274):  at java.lang.reflect.Method.invokeNative(Native Method) 
04-25 12:04:10.750: E/AndroidRuntime(1274):  at java.lang.reflect.Method.invoke(Method.java:515) 
04-25 12:04:10.750: E/AndroidRuntime(1274):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) 
04-25 12:04:10.750: E/AndroidRuntime(1274):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) 
04-25 12:04:10.750: E/AndroidRuntime(1274):  at dalvik.system.NativeStart.main(Native Method) 
04-25 12:04:10.750: E/AndroidRuntime(1274): Caused by: java.lang.NoSuchMethodException: sendMessage [class android.view.View] 
04-25 12:04:10.750: E/AndroidRuntime(1274):  at java.lang.Class.getConstructorOrMethod(Class.java:472) 
04-25 12:04:10.750: E/AndroidRuntime(1274):  at java.lang.Class.getMethod(Class.java:857) 
04-25 12:04:10.750: E/AndroidRuntime(1274):  at android.view.View$1.onClick(View.java:3803) 
04-25 12:04:10.750: E/AndroidRuntime(1274):  ... 11 more 
04-25 12:04:12.720: I/Process(1274): Sending signal. PID: 1274 SIG: 9 

回答

0

它看起來像你的問題是,SendMessage函數應該包含在您的MainActivity代替嵌套在你的片段中。

調試線:

java.lang.IllegalStateException: Could not find a method sendMessage(View) in the activity class com.example.myfirstapp.MainActivity for onClick handler on view class android.widget.Button 

顯示應用程序正在爲這種方法,您MainActivity類別。

+0

按鈕。當我這樣做,出現此錯誤「未定義類型MainActivity的方法getActivity()」我猜getActivity()是一個包含在PlaceholderFragment類的Androids支持庫中的函數。 – user3546050

0

地方sendMessage(View view)方法內MainActivity類,而不是PlaceholderFragment

0

xml處理clicklistener並不總是一個好主意。在按鈕的片段中設置clicklistener,並從onClick方法中調用sendMessage方法clicklistener。

首先爲您的按鈕設置一個ID(示例:sendButton)。

然後,

public static class PlaceholderFragment extends Fragment { 

    public PlaceholderFragment() { 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     View rootView = inflater.inflate(R.layout.fragment_main, container, false); 
     Button b = (Button) rootView.findViewByID(R.id.sendButton); 
     //Here set the clickListener and call sendMessage method 
     return rootView; 
    } 


    /** Called when the user clicks the Send button */ 
    public void sendMessage(View view) { 
     Intent intent = new Intent(getActivity(), DisplayMessageActivity.class); 
     EditText editText = (EditText)getActivity(). findViewById(R.id.edit_message); 
     String message = editText.getText().toString(); 
     intent.putExtra(EXTRA_MESSAGE, message); 
     startActivity(intent); 
    } 

} 

或實現在片段View.OnClickListener然後有像一個case語句:

@Override 
public void onClick(View view) { 
    switch (view.getId()) { 
     case R.id.sendButton: 
      sendMessage(); 
      break; 
     default: 
      Log.i(TAG, "Unknown: " + view.getId()); 
      break; 
    } 
} 
0

做它編程:

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     View rootView = inflater.inflate(R.layout.fragment_main, container, false); 
     Button b = (Button) rootView.findViewById(R.id.my_button); 
     b.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       // handle click here 
      } 
     }); 
     return rootView; 
} 

和插入按鈕一節在您的主要活動佈局中: android: ID = 「@ + ID/my_button」

0

機器人:的onClick = 「的sendMessage」

按鈕的onClick屬性檢索活動中的相應的方法。但是你在片段中定義了這種方法,這就是爲什麼你會發現異常 方法找不到異常。

的Android推薦的方法做處理的onClick的片段裏面按鈕 首先給ID到按鈕

<?xml version="1.0" encoding="utf-8"?> 
<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="horizontal"> 
<EditText android:id="@+id/edit_message" 
    android:layout_weight="1" 
    android:layout_width="0dp" 
    android:layout_height="wrap_content" 
    android:hint="@string/edit_message" /> 
<Button 
    android:id="@+id/button1" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="@string/button_send" 
    /> 
    </LinearLayout> 

您的片段,然後註冊的onClick監聽

/** 
* A placeholder fragment containing a simple view. 
*/ 
public static class PlaceholderFragment extends Fragment implements OnItemClickListener{ 

    public PlaceholderFragment() { 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     View rootView = inflater.inflate(R.layout.fragment_main, container, false); 
    Button b = (Button) rootView.findViewById(R.id.button1); 
    b.setOnClickListener(this); 
     return rootView; 
    } 
    /** Called when the user clicks the Send button */ 
    public void sendMessage(View view) { 
     Intent intent = new Intent(getActivity(), DisplayMessageActivity.class); 
     EditText editText = (EditText)getActivity(). findViewById(R.id.edit_message); 
     String message = editText.getText().toString(); 
     intent.putExtra(EXTRA_MESSAGE, message); 
     startActivity(intent); 
    } 

    public void onClick(View view) 
    { 
     sendMessage(view); 
    } 
} 
+0

試過這個,但我得到一個錯誤,阻止我導入OnClickListener import android.support.v7.internal.widget.AdapterViewICS.OnItemClickListener; //錯誤:類型爲android.support.v7.internal.widget。 AdapterViewICS不可見 – user3546050

相關問題