按钮单击导致应用程序崩溃

问题描述:

我刚刚设置了一个onClick方法,该方法写入活动类中,以便在单击该按钮时被调用。即使在它进入方法之前,应用程序崩溃。按钮单击导致应用程序崩溃

单击浮动操作按钮时出现的错误消息;该活动

java.lang.IllegalArgumentException: Expected receiver of type com.example.bob.vexteamqueuing.AdminControl, 
but got android.support.v7.view.ContextThemeWrapper java.lang.IllegalArgumentException: 
Expected receiver of type com.example.bob.vexteamqueuing.AdminControl, but got android.support.v7.view.ContextThemeWrapper 

at java.lang.reflect.Method.invoke(Native Method) 
at android.view.View$DeclaredOnClickListener.onClick(View.java:4447) 
at android.view.View.performClick(View.java:5198) 
at android.view.View$PerformClick.run(View.java:21147) 
at android.os.Handler.handleCallback(Handler.java:739) 
at android.os.Handler.dispatchMessage(Handler.java:95) 
at android.os.Looper.loop(Looper.java:148) 
at android.app.ActivityThread.main(ActivityThread.java:5417) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 

XML代码:

<?xml version="1.0" encoding="utf-8"?> 

<android.support.design.widget.AppBarLayout 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:theme="@style/NoActionBar"> 

    <android.support.v7.widget.Toolbar 
     android:id="@+id/toolbar" 
     android:layout_width="match_parent" 
     android:layout_height="?attr/actionBarSize" 
     android:background="?attr/colorPrimary" 
     app:popupTheme="@style/AppTheme.PopupOverlay" 
     /> 

</android.support.design.widget.AppBarLayout> 

<include layout="@layout/content_admin_control" /> 

<android.support.design.widget.FloatingActionButton 
    android:id="@+id/fab" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_gravity="bottom|end" 
    android:layout_margin="@dimen/fab_margin" 
    android:src="@android:drawable/ic_input_add" 
    android:onClick="createNewTournament" 
    android:clickable="true" /> 

AdminControl活动的Java代码:

public class AdminControl extends AppCompatActivity { 

     Firebase ref; 
     public static List <Tournament> tournaments; 
     @Override 
     protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.activity_admin_control); 
      Toolbar b = (Toolbar) findViewById(R.id.toolbar); 
      b.setTitle("Tournaments"); 
      setSupportActionBar(b); 
      ref = AdminLogin.firebase.child("users").child(AdminLogin.firebase.getAuth().getUid()); 
      if (tournaments == null){ 
       tournaments = new ArrayList<>(); 
      }   
     } 

     public void createNewTournament(View v) { 
      Intent newIntent = new Intent(this, TournamentCreator.class); 
      startActivity(newIntent); 
     } 
    } 

上创建 - 锦标赛造物主

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_tournament_creator); 
    /*b = (FloatingActionButton) findViewById(R.id.fab); 
    b.setOnClickListener(new View.OnClickListener(){ 
     @Override 
     public void onClick(View v) { 
      beginTournament(v); 
     } 
    });*/ 
} 

清单文件 - 可能不是必要的,但只是提供

<?xml version="1.0" encoding="utf-8"?> 

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

<!-- To auto-complete the email text field in the login form with the user's emails --> 
<uses-permission android:name="android.permission.GET_ACCOUNTS" /> 
<uses-permission android:name="android.permission.READ_PROFILE" /> 
<uses-permission android:name="android.permission.READ_CONTACTS" /> 

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

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
    <activity 
     android:name=".AdminLogin" 
     android:label="@string/title_activity_admin_login" 
     android:parentActivityName=".Initial"> 
     <meta-data 
      android:name="android.support.PARENT_ACTIVITY" 
      android:value="com.example.bob.vexteamqueuing.Initial" /> 
    </activity> 
    <activity android:name=".TournamentCreator" /> 
    <activity 
     android:name=".AdminControl" 
     android:label="@string/title_activity_admin_control" 
     android:parentActivityName=".Initial" 
     android:theme="@style/NoActionBar"> 
     <meta-data 
      android:name="android.support.PARENT_ACTIVITY" 
      android:value="com.example.bob.vexteamqueuing.Initial" /> 
    </activity> 
</application> 

+0

请显示代码 - 特别是'TournamentCreator''Activity'类的'onCreate'。 – ishmaelMakitla

+0

如果您显示整个堆栈跟踪,我们可以准确查看崩溃发生的位置。 – sonictt1

+0

甚至在它进入方法之前,抛出异常并且应用程序崩溃。 – kmindspark

你的问题应该得到解决删除您android:onClick="createNewTournament"事件从您的布局

<android.support.design.widget.FloatingActionButton 
    android:id="@+id/fab" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_gravity="bottom|end" 
    android:layout_margin="@dimen/fab_margin" 
    android:src="@android:drawable/ic_input_add" 
    android:clickable="true" /> 

然后在您的onCreate中添加一个监听器到R.id.fab,就像这样。在这个问题上EditText OnClick Exception

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_admin_control); 
    Toolbar b = (Toolbar) findViewById(R.id.toolbar); 
    b.setTitle("Tournaments"); 
    setSupportActionBar(b); 
    ref = AdminLogin.firebase.child("users").child(AdminLogin.firebase.getAuth().getUid()); 
    if (tournaments == null){ 
     tournaments = new ArrayList<>(); 
    } 

    FloatingActionButton myFab = (FloatingActionButton)findViewById(R.id.fab); 
    myFab.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 
      createNewTournament(v); 
     } 
    }); 
} 

同样的问题发生,使用监听器是固定的。

希望这有助于!

+0

哎呀,看起来我们都差不多在同一时间回答:p –

+0

其实我先回答....但得到你的+1有同样的想法;) –

+0

非常感谢你:) – kmindspark

为什么不这样做的典型方式?通常喜欢尝试通过声明

public class AdminControl extends AppCompatActivity { 
    //.... 
    FloatingActionButton mFAB; 

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

     Toolbar b = (Toolbar) findViewById(R.id.toolbar); 
     //.... 
     mFAB = (FloatingActionButton) findViewById(R.id.fab); 
     mFAB.setOnClickListener(new View.OnClickListener(){  

      @Override 
      public void onClick(View view) { 
       Intent newIntent = new Intent(this, TournamentCreator.class); 
       startActivity(newIntent); 
      }     
     }); 
    } 

并使用XML浮动按钮是这样的:

<android.support.design.widget.FloatingActionButton 
android:id="@+id/fab" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:layout_gravity="bottom|end" 
android:layout_margin="@dimen/fab_margin" 
android:src="@android:drawable/ic_input_add"  
/> 

这是常见的方式,清洁的方式做到这一点,希望我帮助。

+0

非常感谢:) – kmindspark

+0

@kmindspark没有问题的伴侣:)开心的编码。 –

以前的解决方案(由@Gueorgui奥夫雷贡@Muhammad费萨尔海德)工作,但没有,我是希望的东西。我发现问题来自于将android:theme属性设置为视图(在我的情况中),并且还与AppCompat库有关(请参见this)。

所以我简单地删除android:命名空间从该行(从视图的style):

<item name="android:theme">@style/someTheme</item> 

,并使其喜欢:

<item name="theme">@style/someTheme</item> 

,它工作正常。

交互式注意事项是仅在高级API(23测试)和低级API(16和19测试)两种方法(有或没有android:命名空间)上工作的问题。