第四章-Android程序活动单元Activity

1.Activity生命周期

启动状态 运行状态 暂停状态 停止状态 销毁状态

生命周期方法

onCreate()Activity创建时调用
onStart()Activity即将可见时调用
onResume()Activity获取焦点时调用
onPause()Activity被其他Activity覆盖或屏幕锁屏时调用
onStop()Activity对用户不可见时调用
onDestroyActivity销毁时调用
onRestart()Activity从停止到启动时调用

2.Activity的创建、配置、开启和关闭

1.创建-----一个Activity对应一个xml布局文件

image.png

2.配置

创建的每一个Activity都必须在清单文件中配置才生效

    	<activity
            android:name=".MyActivity"
            android:exported="false" />

3.开启和关闭Activity

(1)在MainActivity中添加按钮单击事件,让其跳转到MyActivity页面
(2)在MyActivity中添加按钮单击事件,关闭当前页面

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.i("MainActivity","调用onCreate方法");

        Button btn = findViewById(R.id.btn);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //创建Intent对象   跳转到MyActivity页面
                Intent intent = new Intent(MainActivity.this,MyActivity.class);
                startActivity(intent);
            }
        });
    }
}
public class MyActivity extends AppCompatActivity {

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

        Button btn1 = findViewById(R.id.btn_1);
        btn1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //关闭当前页面
                finish();
            }
        });
    }
}

3.Intent和IntentFilter

使用 Intent 从一个Activity切换到另一个Activity

1.Intent

不仅可以指定当前组件执行的动作,还可以在不同组件之间数据传递

(1)显式Intent

直接指定目标组件

Intent intent = new Intent(A.this, B.class);
    startActivity(intent);
(2)隐式Intent

action用来指定Intent对象的动作
在清单文件中为Activity添加 时,必须添加action属性。否则隐式Intent无法开启

        <activity
            android:name=".C"
            android:exported="false">
            <intent-filter>
<!--                name 不能与 Activity 重名-->
                <action android:name="d" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>
            	Intent intent1 = new Intent();
                intent1.setAction("d");
                startActivity(intent1);

2.IntentFilter

当发送一个隐式Intent后,Android系统会将它与程序中每一个组件的过滤器进行匹配,匹配属性有action、data、category,需要三个属性都匹配成功才能唤起相应组件。

  1. action属性匹配规则
    action属性用来指定Intent对象的动作
  2. data属性匹配规则
    data属性用来指定数据的URI或者数据MIME类型,它的值通常与Intent的action属性有关联。
  3. category属性匹配规则
    category属性用于为action添加额外信息,一个interFilter可以不声明category属性,也可以声明多个category属性。
<intent-filter>      
  <action android:name="android.intent.action.EDIT"/>      
  ······  
<intent-filter> 

标签中间可以罗列多个action属性,但是当使用隐式Intent激活组件时,只要Intent携带的action与其中一个标签中action的声明相同,action属性就匹配成功。
在清单文件中为Activity添加标签时,必须添加action属性,否则隐式Intent无法开启该Activity。

<intent-filter>     
  <data android:mimeType="Video/mpeg" android:scheme="http..."/>    
  ··· 
</intent-filter> 

标签中间可以罗列多个data属性,每个data属性可以指定数据的MIME类型和URI。其中MIME类型可以表示image/ipeg、video/*等媒体类型。
隐式Intent携带的data与其中一个标签中data的声明相同,data属性就匹配成功。

<intent-filter>     
  <category android:name="android.intent.category.DEFAULT"/>    
  ······ 
</intent-filter> 

隐式Intent中声明的category必须全部能够与某一个IntentFilter中的category匹配才算匹配成功。IntentFilter中罗列的category属性数量必须大于或者等于隐式Intent携带的category属性数量时,category属性才能匹配成功。如果一个隐式Intent没有设置category属性,那么它可以通过任何一个IntentFilter的category匹配。

4.Activity之间的跳转

1.putExtra()

通过putExtra()方法将传递的数据储存在Intent对象中

Intent intent = new Intent(MainActivity.this, FirstActivity.class);
                intent.putExtra("name","王小明");
                intent.putExtra("age",12);
                intent.putExtra("isPassed",true);
                startActivity(intent);

接收

//        接收数据并将数据显示在text1
        Intent intent = getIntent();
        String name = intent.getStringExtra("name");
        int age = intent.getIntExtra("age", 0);
        boolean isPassed = intent.getBooleanExtra("isPassed", true);
        text1.setText(name + ":" + age + ":" + isPassed);

2.Bundle

使用Bundle传递数据

Intent intent1 = new Intent(MainActivity.this, SecondActivity.class);
                Bundle bundle = new Bundle();
                bundle.putString("name","王小明");
                bundle.putInt("age",12);
                intent1.putExtras(bundle);
                startActivity(intent1);

接收

//        接收数据并显示在text2
        Bundle bundle = getIntent().getExtras();
        String name = bundle.getString("name");
        int age = bundle.getInt("age");
        text2.setText(name + ":" + age);

3.Activity之间的数据回传

1.startActivityForResult()

用于开启一个Activity,当开启的Activity销毁时,希望从中返回数据。
requestCode表示请求码,用于标识请求来源。

2.setResult()

resultCode表示返回码,用于标识返回的数据来自哪个Activity。
intent用于携带数据并回传到上个界面。

3.onActivityResult()

用于接收回传的数据,并根据传递的参数requestCode、resultCode来识别数据来源

public class MainActivity extends AppCompatActivity {
    Button btn1;
    TextView text;

    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == 1 && resultCode == 2){
            String name = data.getStringExtra("name");
            int age = data.getIntExtra("age", 0);
            text.setText(name + ":" + age);
        }
    }

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

        text = findViewById(R.id.text);
        findViewById(R.id.btn1).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
//                启动SecondActivity,并且希望其回传数据
                Intent intent = new Intent(MainActivity.this, SecondActivity.class);
                startActivityForResult(intent,1);
            }
        });
    }
}
//                回传数据----将数据传回MainActivity
                Intent intent = new Intent();
                intent.putExtra("name", "王小明");
                intent.putExtra("age", 12);
                setResult(2, intent);
                finish();

4.6 使用Fragment(碎片)

4.6.1 Fragment简介

Fragment是一种嵌入在Activity中的UI片段,它可以用来描述Activity中的一部分布局。
一个Activity可以包含多个Fragment,一个Fragment也可以在多个Activity中使用。

4.6.2 Fragment的生命周期

当在Activity中创建Fragment时,Fragment处于启动状态,
当Activity被暂停时,其中的所有Fragment也被暂停,
当Activity被销毁时,其中的所有Fragment也被销毁,
当一个Activity处于运行状态时,可以单独地对每一个Fragment进行操作:添加时Fragment处于启动状态,删除时Fragment处于销毁状态。
Fragment生命周期相比Activity额外方法:

  • onAttach():Fragment和Activity建立关联时调用
  • onCreateView():Fragment创建视图(加载布局)时创建
  • onActivityCreate():Fragment相关联的Activity已经创建时调用
  • onDestroyView(): Fragment关联的视图被移除时调用
  • onDetach(): Fragment和Activity解除关联时调用
  • image.png

4.6.3 创建Fragment

创建Fragment时必须创建一个类继承自Fragement。

public class NewListFragment extends Fragment{
    @Override     
    public View on CreareView(LayoutInflater, inflater, ViewGroup container, Bundle savedInstanceState){
        View v = inflater.inflate(R.layout.fragment,container, false);         
        return v;     
    } 
} 

4.6.4 在Activity中添加Fragment

Fragment创建完成后并不能单独使用,还需要将Fragment添加到Activity中。

  1. 在布局文件中添加Fragment
    需要在Activity引用的布局文件中使用标签,必须指定android:name属性,属性值为Fragment的全路径名称。
  2. 在Activity中动态加载Fragment
    1. 创建一个Fragment实例
    2. 获取FragmentManager的实例
    3. 开启FragmentTransaction
    4. 向Activity的布局容器中添加Fragment
    5. 通过commit()提交事务
<fragment
  android:name="cn.itcast.NewsListFragment"
  android:id="@+id/newslist"
  android:layout_width="match_parent"
  android:layout_height="match_parent"/> 
public class MainActivity extends Activity{
    @SuppressLint("NewApi")
    @Override
    protected void onCreate(Bundle savedInstanceState){
        super.onCreate(saveInstanceState);
        setContentView(R.layout.activity_main);
        NewsListFragment fragment = new NewsListFragment();
        FragmentManage fm = getFragementManager();
        FragmentTransaction beginTransaction = fm.beginTransaction();
        beginTransaction.replace(R.id.ll,fragment);
        beginTransaction.commit(); 
    } 
} 

“getFragmentManager和android.app.Fragment在API 28中已弃用。
现在,我们应该分别使用支持库中的Fragment和getSupportFragmentManager。
但是,如果您担心这些弃用,则还应注意,API 28也弃用了PreferenceFragments。
相反,您应该使用PreferenceFragmentCompat”
应将getFragementManager替换为getSupportFragmentManager()

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
当你使用Android Studio开发第一个Android程序时,布局设计是非常重要的一部分。Android Studio提供了强大的布局编辑器,可以帮助你创建和编辑布局文件。 以下是一些重要的步骤和注意事项,以便在Android Studio中体现布局设计: 1. 创建一个新的Android项目:打开Android Studio并选择“Start a new Android Studio project”选项。按照向导的指示填写项目名称、包名和其他必要的信息。 2. 打开布局编辑器:在项目结构中,找到“res”文件夹,展开它并找到“layout”文件夹。右键点击“layout”文件夹,选择“New -> Layout resource file”来创建一个新的布局文件。 3. 选择布局类型:在创建布局文件时,可以选择不同的布局类型,如线性布局(LinearLayout)、相对布局(RelativeLayout)或帧布局(FrameLayout)。根据你的需求选择适合的布局类型。 4. 使用可视化编辑器:Android Studio提供了可视化编辑器,可以直观地设计和编辑布局。你可以通过拖拽和放置UI组件来构建界面,也可以通过属性面板来设置组件的属性。 5. 使用约束布局:Android Studio还提供了约束布局(ConstraintLayout),它是一种强大且灵活的布局类型。使用约束布局可以更精确地控制组件之间的位置和大小。 6. 预览布局:在编辑布局文件时,你可以随时预览布局的外观和效果。点击Android Studio右上角的“Preview”选项卡,即可查看布局在不同设备上的显示效果。 7. 使用布局编辑器工具:Android Studio的布局编辑器还提供了一些有用的工具,如对齐工具、边距工具和约束工具。这些工具可以帮助你更方便地调整和优化布局。 8. 保存并应用布局:完成布局设计后,记得点击保存按钮保存布局文件。然后,在Activity中使用布局文件来设置界面的内容。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

肉丝不切片

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值