MyException - 我的异常网
当前位置:我的异常网» Android » Android学习路线(5)开启另一个Activity

Android学习路线(5)开启另一个Activity

www.MyException.Cn  网友分享于:2014-08-05  浏览:0次
Android学习路线(五)开启另一个Activity

在完成了 上一篇课程后,你已经有了一个应用。这个应用展示了一个包含一个文本框和一个按钮的activity(一个单独的界面)。在这次的课程中,你将会通过在MainActivity中添加一些代码,来让当给你点击Send按钮时能够跳转到另一个activity中。

响应Send按钮


为了响应按钮的点击事件,打开fragment_main.xml 布局文件,然后在   <Button> 元素中加入android:onClick属性:

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/button_send"
    android:onClick="sendMessage" />

这个 android:onClick 属性的值, "sendMessage",是你的activity中的一个方法的名称,当用户点击按钮时,就会调用这个方法。

打开MainActivity 类,加入相应的方法:

/** Called when the user clicks the Send button */
public void sendMessage(View view) {
    // Do something in response to button
}

为了能够让系统匹配到给android:onClick赋的值的方法名称所对应的方法,签名必须严格的按照显示的来。(the signature must be exactly as shown. )具体如下,这个方法必须要:

  • 是Public的
  • 返回类型为void
  • 只有一个 View 类型的参数(它就代表被点击的View

接下来,你就要填满这个方法。来读取文本框中的内容,然后将内容传递到另一个activity内。

构架一个Intent


Intent 是一个提供两个分离的组件(例如两个activities)在运行时绑定的对象。Intent 表示一个应用“意图要做些事情”。你可以使用intent做很多很多事情,但是它最常用的还是打开另一个activity。

sendMessage() 方法内部,创建一个Intent 来开启一个名为DisplayMessageActivity的activity:

Intent intent = new Intent(this, DisplayMessageActivity.class);

这需要先导入 Intent 类:

import android.content.Intent;

贴士: 在Eclipse中,可以用Ctrl + Shift + O来导入未导入的类(在Mac中使用Cmd + Shift + O)。

这里使用的构造器包含两个参数:

  • 第一个参数是 Context (这里使用this 是因为Activity 类是 Context的子类)
  • 第二个参数是系统要传递给Intent 的应用组件的类(在本例中是要被打开的activity)

提示: DisplayMessageActivity 的将会导致一个error,因为你在使用向Eclipse这种IDE,它会发现这个类还不存在。现在先忽略这个错误,你马上就会创建这个类。

Intent不仅仅只能够打开另一个activity,它还能够携带一个包含数据的bundle。在sendMessage() 方法内部,使用findViewById() 来获取EditText元素,同时将它的值添加到intent中:

Intent intent = new Intent(this, DisplayMessageActivity.class);
EditText editText = (EditText) findViewById(R.id.edit_message);
String message = editText.getText().toString();
intent.putExtra(EXTRA_MESSAGE, message);

提示: 你现在需要导入android.widget.EditText。你马上就要定义一个EXTRA_MESSAGE常量。

Intent 可以携带一系列被称作extars的不同类型的键值对的集合。putExtra() 方式的第一个参数是键的名称,第二个参数是值。

为了让下一个activity能够查到extra data,你应该使用公共的常量为你的intent的键赋值。因此,在MainActivity的头部添加定义EXTRA_MESSAGE

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

在你的应用有何其他应用交互的情况下,使用你的应用的包名作为intent extras定义的键的定义是一个很好的选择。

打开第二个Activity


要打开一个activity,调用startActivity() 方法,并且将Intent传进去,系统接受调用后会开启intent所指定的Activity 的一个实例。

在新的代码中,被Send按钮调用的完整的sendMessage() 方法应该像下面这样:

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

现在你需要创建DisplayMessageActivity 类来继续工作了。

创建第二个Activity


图1. Eclipse中的新建Activity向导

使用Eclipse创建 activity :

  1. 在工具栏点击 New  。
  2. 在出现的窗口中,打开Android 文件夹并选择Android Activity,然后点击Next
  3. 选择BlankActivity 点击 Next
  4. 填满Activity的详情:
    • Project: MyFirstApp
    • Activity Name: DisplayMessageActivity
    • Layout Name: activity_display_message
    • Fragment Layout Name: fragment_display_message
    • Title: My Message
    • Hierarchial Parent: com.example.myfirstapp.MainActivity
    • Navigation Type: None

    点击 Finish

如果你使用的不是Eclipse,或者是在使用命令行工具,那么在src/ 目录下创建DisplayMessageActivity类,然后再MainActivity.java 中导入。

打开DisplayMessageActivity.java 文件,如果你使用Eclipse:

  • 这个类中已经包含了一个onCreate() 方法的实现,稍后你会更新这个实现。
  • 同样还有一个onCreateOptionsMenu() 方法的实现,但是你在本例中不会使用到,你可以将它删掉。
  • 还有onOptionsItemSelected() 方法,它用户处理action bar 的Up 事件,保持它的原样。
  • 还有一个继承Fragment类的 PlaceholderFragment 类。在这个Activity中你不会使用到。

Fragments 将方法和UI分解为可重用的模块。更多关于Fragment的信息,请查看Fragments API Guide。

提示: 如果你使用的不是最新版本的ADT插件,你的activity可能会看起来不同。确保你已经安装了最新版的ADT plugin 来完成本次课程。

DisplayMessageActivity 类现在应该是这样:

public class DisplayMessageActivity extends ActionBarActivity {

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

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

    @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_display_message,
                      container, false);
              return rootView;
        }
    }
}

如果你使用的IDE不是Eclipse,将DisplayMessageActivity 类更新为上面的代码。

所有的Activity 的子类都必须实现onCreate() 方法,系统在创建新的activity实例时会调用这个方法。这个方法是你必须通过setContentView()方法指定activity布局的地方,同时也是你要初始化activity组件的地方。

提示: 如果你使用了非Eclipse的IDE,那么你的工程不包含activity_display_message布局文件。没关系,你马上会更新这个方法,并不需要用到这个布局文件。

添加标题字符串

如果你使用Eclipse,你可以调到next section(下一节),因为模板已经提供了标题字符串。

如果你使用的是其他的IDE,将新的activity的标题添加到 strings.xml 文件中:

<resources>
    ...
    <string name="title_activity_display_message">My Message</string>
</resources>

将新Activity添加到Manifest文件中

所有的activity都必须在manifest文件中声明,AndroidManifest.xml, 使用 <activity> 元素。

当你使用的是Eclipse时,它创建了一个默认的实体。如果你使用的不是Eclipse,那么你需要自己添加清单实体。像下面这样:

<application ... >
    ...
    <activity
        android:name="com.example.myfirstapp.DisplayMessageActivity"
        android:label="@string/title_activity_display_message"
        android:parentActivityName="com.example.myfirstapp.MainActivity" >
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value="com.example.myfirstapp.MainActivity" />
    </activity>
</application>

android:parentActivityName 声明了应用逻辑层次中这个activity父activity的名称。系统会根据这个值来实现默认的导航行为,例如Android4.1或更高版本中的Up navigation行为。你同样可以通过使用Support Library 包,然后再<meta-data> 元素中添加这个值。

提示: 你的Android SDK应该已经包含最新版本的Support包。它被包含在ADT Bundle 中,但是如果你使用的不是Eclipse,你需要在Adding Platforms and Packages 步骤中安装它。当使用Eclipse的模板时,Support包已经被自动添加到你的项目中了。如果你使用的不是Eclipse,你需要手动添加这个库岛你的项目中,按照setting up the Support Library 操作完后回到这里来。

如果你使用Eclipse开发,那么你现在就能够运行程序了,但是并不会发生什么。当点击Send按钮时跳转到新的activity中,但是它使用的是默认的“Hello World”界面。你马上就会更新这个activity,使用一个自定义的文本视图来展示,所以如果你使用的不是Eclipse并且不能编译通过,不用担心。

接收Intent


每个Activity 都会被Intent调用,不管是不是用户操作的。你可以通过调用getIntent() 方法来获取开启你的activity的intent,同时或者它里边包含的数据。

在 DisplayMessageActivity 类的onCreate() 方法中,获取通过MainActivity传递过来的信息:

Intent intent = getIntent();
String message = intent.getStringExtra(MainActivity.EXTRA_MESSAGE);

显示信息


要把信息显示在屏幕上,需要创建一个TextView 控件,然后使用setText()方法。然后通过setContentView()方法添加这个TextView 作为activity布局的根视图。

完整的 onCreate() 方法应该像下面这样:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // Get the message from the intent
    Intent intent = getIntent();
    String message = intent.getStringExtra(MainActivity.EXTRA_MESSAGE);

    // Create the text view
    TextView textView = new TextView(this);
    textView.setTextSize(40);
    textView.setText(message);

    // Set the text view as the activity layout
    setContentView(textView);
}

现在你可以运行你的应用了。它启动之后,输入信息到文本框中,然后点击发送,输入的信息将会出现在第二个activity中。

图2. app中的两个activity,运行于android 4.4

完成啦,你已经创建了你的第一个应用!

1楼guanweivv昨天 23:38
赞赞赞~
Re: sweetvvck昨天 23:39
回复guanweivvn谢谢捧场,后面会继续加油的

文章评论

程序员的鄙视链
程序员的鄙视链
“懒”出效率是程序员的美德
“懒”出效率是程序员的美德
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
编程语言是女人
编程语言是女人
程序员眼里IE浏览器是什么样的
程序员眼里IE浏览器是什么样的
“肮脏的”IT工作排行榜
“肮脏的”IT工作排行榜
漫画:程序员的工作
漫画:程序员的工作
为什么程序员都是夜猫子
为什么程序员都是夜猫子
为啥Android手机总会越用越慢?
为啥Android手机总会越用越慢?
Google伦敦新总部 犹如星级庄园
Google伦敦新总部 犹如星级庄园
老美怎么看待阿里赴美上市
老美怎么看待阿里赴美上市
中美印日四国程序员比较
中美印日四国程序员比较
5款最佳正则表达式编辑调试器
5款最佳正则表达式编辑调试器
当下全球最炙手可热的八位少年创业者
当下全球最炙手可热的八位少年创业者
科技史上最臭名昭著的13大罪犯
科技史上最臭名昭著的13大罪犯
一个程序员的时间管理
一个程序员的时间管理
那些性感的让人尖叫的程序员
那些性感的让人尖叫的程序员
 程序员的样子
程序员的样子
如何区分一个程序员是“老手“还是“新手“?
如何区分一个程序员是“老手“还是“新手“?
做程序猿的老婆应该注意的一些事情
做程序猿的老婆应该注意的一些事情
代码女神横空出世
代码女神横空出世
旅行,写作,编程
旅行,写作,编程
程序员必看的十大电影
程序员必看的十大电影
程序员的一天:一寸光阴一寸金
程序员的一天:一寸光阴一寸金
写给自己也写给你 自己到底该何去何从
写给自己也写给你 自己到底该何去何从
我是如何打败拖延症的
我是如何打败拖延症的
2013年中国软件开发者薪资调查报告
2013年中国软件开发者薪资调查报告
亲爱的项目经理,我恨你
亲爱的项目经理,我恨你
程序员应该关注的一些事儿
程序员应该关注的一些事儿
聊聊HTTPS和SSL/TLS协议
聊聊HTTPS和SSL/TLS协议
程序员最害怕的5件事 你中招了吗?
程序员最害怕的5件事 你中招了吗?
2013年美国开发者薪资调查报告
2013年美国开发者薪资调查报告
总结2014中国互联网十大段子
总结2014中国互联网十大段子
Web开发人员为什么越来越懒了?
Web开发人员为什么越来越懒了?
鲜为人知的编程真相
鲜为人知的编程真相
那些争议最大的编程观点
那些争议最大的编程观点
我跳槽是因为他们的显示器更大
我跳槽是因为他们的显示器更大
Java 与 .NET 的平台发展之争
Java 与 .NET 的平台发展之争
要嫁就嫁程序猿—钱多话少死的早
要嫁就嫁程序猿—钱多话少死的早
Web开发者需具备的8个好习惯
Web开发者需具备的8个好习惯
程序员和编码员之间的区别
程序员和编码员之间的区别
程序猿的崛起——Growth Hacker
程序猿的崛起——Growth Hacker
程序员都该阅读的书
程序员都该阅读的书
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
我的丈夫是个程序员
我的丈夫是个程序员
10个调试和排错的小建议
10个调试和排错的小建议
Java程序员必看电影
Java程序员必看电影
10个帮程序员减压放松的网站
10个帮程序员减压放松的网站
什么才是优秀的用户界面设计
什么才是优秀的用户界面设计
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有