应用程序在更改视图时会崩溃

时间:2016-04-15 20:17:21

标签: android xml

我想创建一个非常简单的应用程序。该应用程序应包含2个视图。在两个视图中都有一个按钮。通过单击按钮,视图应该更改。

这是我的文件夹结构

folder structur

我有两个活动和两个activity_layouts。如您所见,OverviewActivity不在活动文件夹中。当我将它放入文件夹时,我得到了这个结构:

enter image description here

为什么活动文件夹不在了?你能给我一点解释吗?

好的,但在这个问题中,我使用了第一个文件夹结构。

activity_login.xml



<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="company.useradministration.activity.LoginActivity">

    <Button
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:onClick="btnOverview"
        android:text="go to overview"/>
</RelativeLayout>
&#13;
&#13;
&#13;

activity_overview.xml

&#13;
&#13;
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".activity.OverviewActivity">

    <Button
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:onClick="btnLogin"
        android:text="go to login"/>
</RelativeLayout>
&#13;
&#13;
&#13;

LoginActivity

&#13;
&#13;
package company.useradministration.activity;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;

import company.useradministration.R;

public class LoginActivity extends AppCompatActivity {

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

    public void btnOverview(View view){
        setContentView(R.layout.activity_overview);
    }
}
&#13;
&#13;
&#13;

OverviewActivity

&#13;
&#13;
package company.useradministration.activity;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;

import company.useradministration.R;

public class OverviewActivity extends AppCompatActivity {

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

    public void btnLogin(View view){
        setContentView(R.layout.activity_login);
    }
}
&#13;
&#13;
&#13;

好。当我启动应用程序时,我看到一个带有文本的按钮&#34;去查看&#34;。按下此按钮后,视图已更改。现在我看到一个带有文字的按钮&#34;进入概述&#34;。当我按下此按钮时,应用程序崩溃并显示错误:

java.lang.IllegalStateException: Could not find method btnOverview(View) in a parent or ancestor Context for android:onClick attribute defined on view class android.support.v7.widget.AppCompatButton
at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.resolveMethod(AppCompatViewInflater.java:307)
at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:266)
at android.view.View.performClick(View.java:4438)
at android.view.View$PerformClick.run(View.java:18439)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5085)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:611)
at dalvik.system.NativeStart.main(Native Method)

3 个答案:

答案 0 :(得分:1)

UPDATE:

以下是解释的答案:

你有一个activity_overview.xml的课程OverviewActivity。 在activity_overview.xml中,您将android:onClick="btnLogin"设置为按钮,然后您拥有:

public void btnLogin(View view){
    setContentView(R.layout.activity_login);
}

在您的OverviewActivity中,因此当用户点击此按钮时,它会成功更改内容视图。 这里的问题是:

为什么单击activity_login.xml中的按钮将内容视图更改回activity_overview.xml时应用程序崩溃?

简单。因为您已在LoginActivity中设置了onclick方法,但您没有切换到该活动,只是更改了布局。因此,当点击返回概述内容的按钮时,应用会在您OverviewActivity中搜索该功能,因为该活动未转到LoginActivity。它刚刚更改了内容,btnOverview中没有名为OverviewActivity的功能。所以这里有2个解决方案: 1 - 仅在一个xml文件中创建两个RelativeLayout,而在按钮单击时创建每个布局的setVisibility。 所以,你必须:

只创建一个活动而不是两个不同的活动,并在其xml文件中使用此代码:

    <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">
   <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
       android:id="@+id/overview"
       android:visibility="gone">
       <Button
           android:layout_width="wrap_content"
           android:layout_centerVertical="true"
           android:layout_centerHorizontal="true"
           android:text="go to login"
           android:id="@+id/go_to_login"
           android:layout_height="wrap_content" />
    //Do your stuff here for overview content
    </RelativeLayout>
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/login">
        <Button
            android:layout_width="wrap_content"
            android:layout_centerVertical="true"
            android:layout_centerHorizontal="true"
            android:text="go to overview"
            android:id="@+id/go_to_overview"
            android:layout_height="wrap_content" />
   //Do your stuff here for login content
    </RelativeLayout>
</RelativeLayout>

此代码有2 RelativeLayout秒。第一个id:overview是概述内容,其可见性已消失,第二个RelativeLayout id:login默认情况下可见(根据需要更改两个布局可见性)。< / p>

MainActivty.java(按照您的意愿调用),您可以更改这些视图的可见性,如下所示:

public class MainActivity extends AppCompatActivity {
Button goToOverview, goToLogin;
RelativeLayout overview, login;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //Remember to change the content to match your xml file name
    setContentView(R.layout.activity_main);

    //Buttons
    goToOverview = (Button) findViewById(R.id.go_to_overview);
    goToLogin = (Button) findViewById(R.id.go_to_login);

    //Layouts
    overview = (RelativeLayout) findViewById(R.id.overview);
    login = (RelativeLayout) findViewById(R.id.login);

    goToOverview.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            login.setVisibility(View.GONE);
            overview.setVisibility(View.VISIBLE);
        }
    });

    goToLogin.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            overview.setVisibility(View.GONE);
            login.setVisibility(View.VISIBLE);
        }
    });
}

通过这种方式,您可以毫无问题地切换到两种不同的布局。

编辑:您也可以使用此解决方案实现此目标,但第一个解决方案与此解决方案之间的区别仅在于您将拥有2个xml文件而不是一个。

第二 - 您将拥有一个java类文件(在此示例中,我将以OverviewActivity为例)和2个不同的布局文件(您已经拥有:activity_login.xmlactivity_overview.xml)。

因此,在activity_overview.xml更改此行:tools:context=".activity.OverviewActivity"tools:context=".OverviewActivity",因为您说您正在使用OverviewActivity文件不在活动中的第一个文件夹结构夹。 比在OverviewActivity中进行以下更改:

public class OverviewActivity extends AppCompatActivity {

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

public void btnLogin(View view){
    setContentView(R.layout.activity_login);
}

public void btnOverview(View view){
    setContentView(R.layout.activity_overview);
}
}

就是这样。如果您对代码有任何问题,请发表评论。我很乐意再帮助你。 希望这可以解决您的问题。 此致

答案 1 :(得分:0)

我认为这是你的问题:

public void btnOverview(View view){
    setContentView(R.layout.activity_overview);
}

这会将当前活动LoginActivity的布局更改为activity_overview,其中包含查找btnLogin方法的按钮

您正在成功更改布局,但您保持相同的活动,因此新布局正在寻找其他活动中存在的方法

而是将上面的代码更改为:

public void btnOverview(View view){
    Intent intent = new Intent(this, OverviewActivity.class);
    startActivity(intent);
}

并在OverviewActivity

public void btnLogin(View view){
    Intent intent = new Intent(this, LoginActivity.class);
    startActivity(intent);
}

答案 2 :(得分:0)

我认为您可以使用this作为帮助。我自己是android java编程的新手,但我相信你必须创建 intent 才能转移到另一个活动。另外,请务必将您的活动添加到 AndroidManifest.xml 。这就是我想的。如果我错了,如果有经验的人会纠正我,我会很高兴:)