我想创建一个非常简单的应用程序。该应用程序应包含2个视图。在两个视图中都有一个按钮。通过单击按钮,视图应该更改。
这是我的文件夹结构
我有两个活动和两个activity_layouts。如您所见,OverviewActivity
不在活动文件夹中。当我将它放入文件夹时,我得到了这个结构:
为什么活动文件夹不在了?你能给我一点解释吗?
好的,但在这个问题中,我使用了第一个文件夹结构。
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;
activity_overview.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=".activity.OverviewActivity">
<Button
android:layout_width="match_parent"
android:layout_height="match_parent"
android:onClick="btnLogin"
android:text="go to login"/>
</RelativeLayout>
&#13;
LoginActivity
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;
OverviewActivity
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;
好。当我启动应用程序时,我看到一个带有文本的按钮&#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)
答案 0 :(得分:1)
以下是解释的答案:
你有一个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.xml
和activity_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 。这就是我想的。如果我错了,如果有经验的人会纠正我,我会很高兴:)