np.full_Android Full App,第1部分:主要活动UI

np.full

np.full

这是“ Android完整应用程序教程”系列的第一部分。 完整的应用程序旨在提供一种通过互联网搜索电影/演员的简便方法。 在这一部分中,我们将设置Eclipse项目,为主要活动准备用户界面,最后在适当的模拟Android设备上对其进行测试。

让我们从创建一个新的Eclipse项目开始(我想您已经安装了Android SDK和Eclipse插件)。 该项目名为“ AndroidMovieSearchAppProject”,应用程序名为“ MovieSearchApp”(我知道这是一个非常原始的名称)。 请注意,由于不会使用最新的API,因此将Android 1.5(API级别3)用作目标平台。

我们的用户界面将非常简单。 用户将在其中提供搜索查询的文本框,两个单选按钮(指示这是电影搜索还是人物搜索),显示搜索类型的标签以及实际执行搜索的按钮。 搜索结果将在其他活动中显示(将在本系列的后续部分中讨论)。

您可能知道,该接口是通过XML文件创建的,目的是将表示视图与应用程序逻辑分离。 相应的文件名为“ main.xml”,位于“ res / layout”文件夹中。 使用Eclipse编辑器打开它,并确保它包含以下内容:

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

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
    
    <EditText android:id="@+id/search_edit_text" 
        android:text="@string/search"
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
    />
    
    <RadioGroup
        android:id="@+id/search_radio_group"
          android:layout_width="fill_parent"
          android:layout_height="wrap_content"
          android:orientation="vertical">
        <RadioButton 
            android:id="@+id/movie_search_radio_button"
            android:checked="true"
            android:layout_width="wrap_content" 
            android:layout_height="wrap_content"
            android:text="@string/movies" />
        <RadioButton 
            android:id="@+id/people_search_radio_button"
            android:checked="false"
            android:layout_width="wrap_content" 
            android:layout_height="wrap_content"
            android:text="@string/people" />
    </RadioGroup>
    
    <TextView 
        android:id="@+id/search_type_text_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="#ffffff" 
    />
    
    <Button 
        android:id="@+id/search_button" 
        android:text="@string/search"
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
    />
    
</LinearLayout>

请注意,文本元素不是硬编码的,而是从外部资源,更具体地说是从位于“ res / values”文件夹中的名为“ strings.xml”的文件中获取其值。 这是实现您的应用程序国际化的一个好习惯。 该文件如下:

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

<resources>

    <string name="hello">Hello World, MovieSearchAppActivity!</string>
    <string name="app_name">MovieSearchApp</string>
    
    <string name="search">Search</string>
    <string name="movies">Movies</string>
    <string name="people">People</string>
    
</resources>

这是Android模拟器中的界面外观:

下一步是将这些UI元素连接到我们的代码中,并进行相应的操作,以实现我们的搜索功能。 可以通过findViewById方法进行连接,其中integer参数是XML声明文件中给定元素的唯一ID。

Android UI小部件的一个非常重要的方面是,它们提供了“挂钩”,当用户执行操作时(例如当他单击按钮或遍历小部件时),开发人员可以得到通知。 为了处理单击事件,我们实现了OnClickListener接口,该接口定义了单击视图时要调用的回调。 该界面仅包含一个名为onClick的方法,该方法在单击视图后会被调用。

另一个有用的接口是OnFocusChangeListener ,它定义了视图的焦点状态更改时要调用的回调。 它的唯一方法是onFocusChange ,当视图的焦点状态更改时将调用该方法。

让我们看看如何应用所有这些以创建我们的主Activity 。 我们的主类的代码如下:

package com.javacodegeeks.android.apps.moviesearchapp;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnFocusChangeListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.TextView;
import android.widget.Toast;

public class MovieSearchAppActivity extends Activity {
    
    private static final String EMPTY_STRING = "";
    
    private EditText searchEditText;
    private RadioButton moviesSearchRadioButton;
    private RadioButton peopleSearchRadioButton;
    private RadioGroup searchRadioGroup;
    private TextView searchTypeTextView;
    private Button searchButton;
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        this.findAllViewsById();
        
        moviesSearchRadioButton.setOnClickListener(radioButtonListener);
        peopleSearchRadioButton.setOnClickListener(radioButtonListener);
        
        searchButton.setOnClickListener(new OnClickListener() {            
            @Override
            public void onClick(View v) {
                String query = searchEditText.getText().toString();
                if (moviesSearchRadioButton.isChecked()) {
                    longToast(moviesSearchRadioButton.getText() + " " + query);
                }
                else if (peopleSearchRadioButton.isChecked()) {
                    longToast(peopleSearchRadioButton.getText() + " " + query);
                }
            }
        });
        
        searchEditText.setOnFocusChangeListener(new DftTextOnFocusListener(getString(R.string.search)));
        
        int id = searchRadioGroup.getCheckedRadioButtonId();
        RadioButton radioButton = (RadioButton) findViewById(id);
        searchTypeTextView.setText(radioButton.getText());
        
    }
    
    private void findAllViewsById() {
        searchEditText = (EditText) findViewById(R.id.search_edit_text);
        moviesSearchRadioButton = (RadioButton) findViewById(R.id.movie_search_radio_button);
        peopleSearchRadioButton = (RadioButton) findViewById(R.id.people_search_radio_button);
        searchRadioGroup = (RadioGroup) findViewById(R.id.search_radio_group);
        searchTypeTextView = (TextView) findViewById(R.id.search_type_text_view);
        searchButton = (Button) findViewById(R.id.search_button);
    }
    
    public void longToast(CharSequence message) {
        Toast.makeText(this, message, Toast.LENGTH_LONG).show();
    }
    
    private OnClickListener radioButtonListener = new OnClickListener() {
        public void onClick(View v) {
            RadioButton radioButton = (RadioButton) v;
            searchTypeTextView.setText(radioButton.getText());
        }
    };

    private class DftTextOnFocusListener implements OnFocusChangeListener {
        
        private String defaultText;

        public DftTextOnFocusListener(String defaultText) {
            this.defaultText = defaultText;
        }

        public void onFocusChange(View v, boolean hasFocus) {
            if (v instanceof EditText) {
                EditText focusedEditText = (EditText) v;
                // handle obtaining focus
                if (hasFocus) {
                    if (focusedEditText.getText().toString().equals(defaultText)) {
                        focusedEditText.setText(EMPTY_STRING);
                    }
                }
                // handle losing focus
                else {
                    if (focusedEditText.getText().toString().equals(EMPTY_STRING)) {
                        focusedEditText.setText(defaultText);
                    }
                }
            }
        }
        
    }
    
}

我们首先使用setContentView方法为活动设置View 。 使用的视图是由“ main.xml”文件定义的视图。 然后,我们引用所有UI元素,以便可以通过代码对其进行操作。 我们创建两个OnClickListener ,一个用于处理单选按钮的单击,另一个用于在单击按钮时执行搜索。 使用setOnClickListener方法将侦听器附加到UI元素。

关于单选按钮,它们是根据RadioGroup组件定义的。 Android UI框架负责在任何给定时间只允许选择一个RadioButton 。 此外,在运行时,我们可以使用getCheckedRadioButtonId方法找到选择了哪个单选按钮。 请注意,此方法返回单选按钮的全局唯一ID,并且可以用作findViewById方法的参数来获取按钮的引用。

最后,我们创建一个OnFocusChangeListener并使用setOnFocusChangeListener方法将其附加到EditText小部件。 通过我们的实施,我们能够实现下图所示的功能。

当文本框具有焦点并且为空时,您就可以输入搜索查询了。 无论文本框是否具有焦点,查询都保留在那里。 但是,当文本框为空并失去焦点时,将显示预定义的消息。

现在,我们准备尝试我们的应用程序。 这将使用Android SDK提供的模拟器来完成。 从Eclipse内部启动AVD(Android虚拟设备)管理器并创建一个新设备。 给它起一个不同的名称,例如“ Android1.5-SD”,然后选择目标平台(在我们的示例中为Android 1.5)。 我还选择了对SD卡的支持,以防万一。 这是设置的样子:

接下来,在Eclipse中创建一个新的“运行配置”,选择我们的Android项目和“ MovieSearchAppActivity”启动。 这是您应该看到的:

在“目标”选项卡中,选择新创建的AVD,然后单击“应用”和“运行”。

Android仿真器将启动,过一会儿我们的应用程序将出现(如果应用程序没有自动出现,请点击“ MENU”按钮)。

玩这个应用程序。 目前,它不执行任何高级操作,而仅在单击按钮时提供Toast。

这将是“ Android完整应用程序教程”系列的第一部分。 您可以在此处找到整个Eclipse项目。

相关文章 :

翻译自: https://www.javacodegeeks.com/2010/10/android-full-app-part-1-main-activity.html

np.full

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值