【问题标题】:Android: how to switch from 1 view to another?Android:如何从一种视图切换到另一种视图?
【发布时间】:2012-08-01 06:10:27
【问题描述】:

我昨天刚开始学习 Android,想编写一个非常简单的应用程序,其中包含 2 个视图用于学习目的。

Activity/View 1: 1 按钮和文本“Hello World” 单击按钮时,它应该转到下一个只有“测试”文本的活动/视图。

这是我的活动 1 代码:

package helloworld.app;


import android.os.Bundle; 
import android.app.Activity; 
import android.view.Menu; 
import android.view.MenuItem; import
android.support.v4.app.NavUtils; 
/*import AudioRecordTest;*/

public class MainActivity extends Activity {

 @Override
 public void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     setContentView(R.layout.activity_main);
 }
 @Override
 public boolean onCreateOptionsMenu(Menu menu) {
     getMenuInflater().inflate(R.menu.activity_main, menu);
     return true;
 }

 public void startRecording() {
    setContentView(R.layout.next_page);
 }
  }

这是我的活动 2 代码: 打包 helloworld.app;

import android.os.Bundle; 
import android.app.Activity; import
android.view.Menu; 
import android.view.MenuItem; import
android.support.v4.app.NavUtils; 
/*import AudioRecordTest;*/

public class next_page extends Activity {

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

这是我的活动 1 的 xml 文件代码:

<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" >

 <TextView
     android:id="@+id/textView1"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:layout_centerHorizontal="true"
     android:layout_centerVertical="true"
     android:padding="@dimen/padding_medium"
     android:text="@string/hello_world"
     tools:context=".MainActivity" />

 <Button
     android:id="@+id/button1"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:layout_alignParentTop="true"
     android:layout_alignRight="@+id/textView1"
     android:layout_marginRight="40dp"
     android:layout_marginTop="32dp"
     android:text="Start Recording"
     android:onClick="startRecording" />

</RelativeLayout>

编辑: 这是来自 logcat 的错误消息

08-01 07:00:49.253:I/Choreographer(1326):跳过 40 帧!这 应用程序可能在其主线程上做了太多工作。

08-01 07:01:11.653: D/AndroidRuntime(1326): 关闭虚拟机

08-01 07:01:11.653: W/dalvikvm(1326): threadid=1: 线程退出 未捕获的异常(组=0x40a13300)

08-01 07:01:11.673:E/AndroidRuntime(1326):致命异常:主要

08-01 07:01:11.673: E/AndroidRuntime(1326): java.lang.IllegalStateException:找不到方法 活动类 helloworld.app.MainActivity 中的 startRecording(View) 用于视图类 android.widget.Button 上的 onClick 处理程序,带有 id '按钮1'

08-01 07:01:11.673: E/AndroidRuntime(1326): 在 android.view.View$1.onClick(View.java:3578)

08-01 07:01:11.673: E/AndroidRuntime(1326): 在 android.view.View.performClick(View.java:4084)

08-01 07:01:11.673: E/AndroidRuntime(1326): 在 android.view.View$PerformClick.run(View.java:16966)

08-01 07:01:11.673: E/AndroidRuntime(1326): 在 android.os.Handler.handleCallback(Handler.java:615)

08-01 07:01:11.673: E/AndroidRuntime(1326): 在 android.os.Handler.dispatchMessage(Handler.java:92)

08-01 07:01:11.673: E/AndroidRuntime(1326): 在 android.os.Looper.loop(Looper.java:137)

08-01 07:01:11.673: E/AndroidRuntime(1326): 在 android.app.ActivityThread.main(ActivityThread.java:4745)

08-01 07:01:11.673: E/AndroidRuntime(1326): 在 java.lang.reflect.Method.invokeNative(Native Method)

08-01 07:01:11.673: E/AndroidRuntime(1326): 在 java.lang.reflect.Method.invoke(Method.java:511)

08-01 07:01:11.673: E/AndroidRuntime(1326): 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)

08-01 07:01:11.673: E/AndroidRuntime(1326): 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)

08-01 07:01:11.673: E/AndroidRuntime(1326): 在 dalvik.system.NativeStart.main(Native Method)

08-01 07:01:11.673: E/AndroidRuntime(1326): 由: java.lang.NoSuchMethodException: startRecording [类 android.view.View]

08-01 07:01:11.673: E/AndroidRuntime(1326): 在 java.lang.Class.getConstructorOrMethod(Class.java:460)

08-01 07:01:11.673: E/AndroidRuntime(1326): 在 java.lang.Class.getMethod(Class.java:915)

08-01 07:01:11.673: E/AndroidRuntime(1326): 在 android.view.View$1.onClick(View.java:3571)

08-01 07:01:11.673: E/AndroidRuntime(1326): ... 11 更多

编辑2: 我发现了我的错误!我应该为我的 startRecording 函数传入 View 视图。这是编辑后的代码:

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

【问题讨论】:

  • 您的问题是什么?这段代码不起作用吗?以不受欢迎的方式工作?还有什么?
  • 当我点击按钮时它崩溃了。
  • 请发布异常堆栈跟踪。
  • 阅读此内容:source.android.com/source/code-style.html 但如果您不想这样做。类以大写字母开头,方法以小写字母开头,你不要在类名中使用 _ 但如果一个 2 字的类名作为 next_page 应该是 NextPage。
  • @TedHopp,我如何获得异常堆栈跟踪?当我的应用崩溃但无法在任何地方找到它时,我希望看到某些形式的错误报告。

标签: android


【解决方案1】:

要使其工作,这应该是您的 startRecording 方法:

public void startRecording(View v) {     
    // setContentView(R.layout.next_page); this will modify the current activity view
    // if you want to start a new activity:
    Intent i = new Intent(this, next_page.class);
    startActivity(i);
}

确保您已在清单文件中声明了这两个活动。 要让 android “看到”并使用您的活动,必须在 AndroidManifest.xml 文件中声明:

// ...
<activity android:name=".MainActivity" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
</activity>
<activity android:name=".next_page" />
// ...

你应该阅读 android 开发者网站或一些教程,这是基本的东西。

【讨论】:

  • +1 用于完全阅读他的 xml 哈哈。我刚刚意识到他设置了 onClick 属性。太懒了所以我会和你一起去:)
  • 在清单文件中声明这两个活动是什么意思?
  • @Sakura 查看我编辑的答案。 Android 必须知道您的应用将要使用的每个活动,并且您可以通过在清单中声明活动来告知它。
  • 我是否只是在 mainactivity 之后添加“”?当我点击按钮时,我的应用程序仍然崩溃。
  • @Sakura 您只需将这一行 &lt;activity android:name=".next_page" /&gt; 添加到 MainActivity 部分之后但在 标记之间的 AndroidManifest.xml。如果你有错误,你应该从 logcat 中添加带有异常的堆栈跟踪,看看它告诉你什么。
【解决方案2】:

您可以使用 Intent 类从一个 Activity 转到一个 Activity

public void startRecording(View v) {
    Intent intent = new Intent(this, NewActivity.class);
    startActivity(intent);

}

Add your Android Manifest configuration file



   <activity android:name="NewActivity"></activity>

【讨论】:

  • 你的意思是想把代码加到startRecording函数中吗?像这样的东西: public void startRecording() { Intent intent = new Intent(this, next_page.class);开始活动(意图); }
  • 你完全正确。现在我编辑了您所描述的代码。
【解决方案3】:

使用缩进在活动之间切换。 示例代码

btnNextScreen.setOnClickListener(new View.OnClickListener() {

        public void onClick(View arg0) {
            //Starting a new Intent
            Intent nextScreen = new Intent(getApplicationContext(), SecondScreenActivity.class);

            //Sending data to another Activity
            nextScreen.putExtra("name", inputName.getText().toString());
            nextScreen.putExtra("email", inputEmail.getText().toString());

            Log.e("n", inputName.getText()+"."+ inputEmail.getText());

            startActivity(nextScreen);

        }
    });

【讨论】:

    【解决方案4】:

    好吧,你假设触发下一个 Activity 的是 Button,我会这样做:

    Button butt = (Button)findViewById(R.id.button1);
    butt.setOnClickListener(new View.onClickListener(
        public void onClick(View v) {
            Intent intent = new Intent(v.getContext());
            //optionally, you could provide it stuff to send to the second Activity if you wish
            startActivity(intent);
        }
    ));
    

    但老实说,您本可以通过研究自己弄清楚这一点。

    【讨论】:

    • 如果我没记错的话,onClickListener 与点击当前视图上的任何地方有关。但是,我想点击按钮进入下一个视图。
    • 不,无论您将其设置为什么,都可以点击。在这种情况下,按钮。无论哪种情况,Luksprog 都是最简单的。快速,简单,我建议这样做。但无论如何,意图部分都是一样的。
    【解决方案5】:

    startRecording - 错误代码。 需要写:

    startActivity(new Intent(this, next_page.class));
    

    并学习如何格式化代码

    【讨论】:

      【解决方案6】:

      在第一个活动的 onCreate 方法中,如下所示

      Button button1=(Button)findViewById(r.id.button1);
      
      button1.setOnClickListener(new View.OnClickListener() {
      
                  @Override
                  public void onClick(View v) {
                      // TODO Auto-generated method stub
                  Intent intent = new Intent(this, NewActivity.class);
      startActivity(intent);  
                  }
              });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-21
        相关资源
        最近更新 更多