2015/8/19/横、竖、满屏/消除标题、标题栏/startActivityForResult(启动带有返回值的intent)/Intent

本文介绍了Android中如何处理横屏、竖屏和全屏显示,以及如何消除标题栏。此外,详细讲解了如何使用startActivityForResult进行带有返回值的Activity启动,并探讨了Intent在Android应用中的作用和使用场景,包括隐式启动Activity的例子。

横屏、竖屏、满屏

消除标题、标题栏

startActivityForResult

Intent

一横屏、竖屏、满屏

1.如果代码中没有写有关横屏或者竖屏的代码是默认为可以根据手机的旋转来自动调整横屏或者竖屏
2.如果在manifest的Activity中添加代码

 android:screenOrientation="portrait"

那么显示方式就一直为竖屏,不会因为手机的调整而调整,一般程序开发中很少用到
3.如果在manifest的Activity中添加代码

android:theme="@android:style/Theme.NoTitleBar.Fullscreen"

代表的是全屏显示


二消除标题栏、消除标题就两行代码就解决掉了

在onCreate中方法写上这两行文字就可以了

this.requestWindowFeature(Window.FEATURE_NO_TITLE);//去掉标题栏,必须写在setContentView之前
this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);//去掉信息栏

三Activity的启动

1.直接启动Activity
Intent intent=newIntent(ManiActivity(当前Activity).this,SecondActivity(另一个Activity).class);
startActivity(intent);
2.带返回值的启动方式startActivityForResult(intent)
(1)创建一个新的Activity,在Layout中添加一个Button和一个输入文本框
(2)在当前Activity中添加一个Button,添加一个点击事件,能够调用到创建的Activity,然后用startActivityForResult(intent,requestCode)启动,第二个参数为int值,可以随便写
(3)在新创建的Activity中调用getIntent()方法得到Intent,然后将从文本框中得到的数据封装intent.putExtra(“secondbackdata”,editText.getText().toString()),然后设置resultCode setResult(RESULT_OK,intent);最后调用ActivityForResult.this.finish(); 结束Activity
(4)在当前Activity重写onActivityResult(requestCode,resultCode,Intent data)
判断resultCode
然后从data中取出数据

 ?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/editText" />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="返回结果"
        android:id="@+id/button_back" />
</LinearLayout>

public class ActivityForResult extends Activity {
    private EditText editText;
    private Button button;
    Intent intent;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_for_result);
        editText= (EditText) findViewById(R.id.editText);
        intent= getIntent();                                    //用于得到调用该Activity的intent
        button= (Button) findViewById(R.id.button_back);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                intent.putExtra("backdata",editText.getText().toString());//将的得到的文本放入到指定的key中
                setResult(RESULT_OK,intent);                                //设置结果
                ActivityForResult.this.finish();                             //结束该Activity
            }
        });
    }
}
//当前Activity中
 Button button_forresult=(Button)findViewById(R.id.button_forresult);
            button_forresult.setOnClickListener(new View.OnClickListener(){
                @Override
                public void onClick(View v) {
                    Intent intent_forresult=new Intent(MainActivity.this,ActivityForResult.class);
                    //传入的2个参数第一个是Intent类型的,第二个是一个固定的数值(随便写)
                    startActivityForResult(intent_forresult,0x23);
                }
            });
***
     * 该方法是用于能在该Activity中调用具有返回值的Activity,用于显示返回值
     * @param requestCode 第一个参数是requestCode,即在startActivityForResult中传入的第二参数
     * @param resultCode    第二个参数是resultCode,在第二个界面中setResult中的第一个参数
     * @param data          第三个参数data,即在第二个界面中setResult中的第二个参数
     */
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode==RESULT_OK){
            String str=data.getStringExtra("backdata");     //从data中的到返回值
            textView.setText(str);                          //将得到的返回值显示在文本框中
        }
    }
//最重要的一点要在manife中声明Activity
<activity android:name=".ActivityForResult"></activity>       

Intent
  1. Android四大组件 Activity Service ContentProvider BroadcastReceiver
    Intent 可以成为第五大组件
    2.Intent Android中进行通讯的工具,类似包裹
    3.下面的程序主要是模拟练习Action的,主要功能有:打电话发短信打开网页
    隐式启动Activity
public class IntentActivityTest extends Activity {
    private  Button mBtnCall;
    private  Button mBtnCallMe;
    private  Button mBtnSms;
    private  Button mBtnWeb;
    private  Button mBtnHide;
    private TextView mEditText;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.intent_activity_test);
        mEditText= (TextView) findViewById(R.id.editText2);
        //点击事件,用于启动隐式界面,并将文本传送给调用的界面
        mBtnHide= (Button) findViewById(R.id.button_hide);
        mBtnHide.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent=new Intent("com.example.my.eightingaug.test");//调用指定的Activity
                String str=mEditText.getText().toString();
                intent.putExtra("toMain",str);
                startActivity(intent);
            }
        });
        //点击事件,用于向10086发送文本内容为"The SMS test"的信息,
        //需要 在manifest中得到权限<uses-permission android:name="android.permission.SEND_SMS"></uses-permission>
        mBtnSms= (Button) findViewById(R.id.button_sms);
        mBtnSms.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent=new Intent();
                intent.setAction(Intent.ACTION_SENDTO);
                intent.setData(Uri.parse("smsto:10086"));
                intent.putExtra("sms_body","The SMS test");
                startActivity(intent);
            }
        });
        //点击事件,用于打开指定URL
        mBtnWeb= (Button) findViewById(R.id.button_web);
        mBtnWeb.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent=new Intent();
                intent.setAction(Intent.ACTION_VIEW);
                intent.setData(Uri.parse("http://www.baidu.com"));
                startActivity(intent);
            }
        });
        //点击事件,用于拨打电话,可以从键盘输入
        mBtnCall= (Button) findViewById(R.id.button_call);
        mBtnCall.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent=new Intent();
                intent.setAction(Intent.ACTION_DIAL);
                //如果不设置DATA只会调用打电话的界面,没有电话号码,如果有号码必须设置Data
                //传入一个Uri
                intent.setData(Uri.parse("tel:18300605531"));
                startActivity(intent);
            }
        });
        //点击事件,用于直接拨打电话,需要权限
        // <uses-permission android:name="android.permission.CALL_PHONE"></uses-permission>
        mBtnCallMe= (Button) findViewById(R.id.button_callme);
        mBtnCallMe.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent=new Intent();
                intent.setAction(Intent.ACTION_CALL);
                //如果有号码会直接拨打号码
                //传入一个Uri
                intent.setData(Uri.parse("tel:18300605531"));
                startActivity(intent);
            }
        });
    }
}

/在主要Activity中的程序
//点击事件,用于调用其他的Activity
Button button_phone= (Button) findViewById(R.id.button_phone);
        button_phone.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent_phone=new Intent(MainActivity.this,IntentActivityTest.class);
                startActivity(intent_phone);
            }
        });



<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.my.eightingaug" >
    <!-- 这里是两个权限,一个是CALL_PHONE用于手机拨打电话另一个是SEND_SMS用于手机发送短信-->
    <uses-permission android:name="android.permission.CALL_PHONE"></uses-permission>
    <uses-permission android:name="android.permission.SEND_SMS"></uses-permission>
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name"

            >
            <!--  android:screenOrientation="portrait"-->
            <!--android:theme="@android:style/Theme.NoTitleBar.Fullscreen"-->

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

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
            <!--这是自己定义的intent过滤器,在某个Activity中放入该过滤器,
                只有当调用该name="名字一般为包的名称"时,才会启动该过滤器,即调用
               这个Activity也可以调用Activity自身,可以用于隐式的启动界面
            -->
            <intent-filter>
                <action android:name="com.example.my.eightingaug.test" />

                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>
       <!-- 每一个活动都需要在manifest中声明-->
        <activity android:name=".SecondActivity"
            android:theme="@android:style/Theme.Dialog">

        </activity><!--theme主题是以弹窗的形式返回第二个窗口-->
        <activity android:name=".ActivityForResult"></activity>
        <activity android:name=".IntentActivityTest"></activity>

    </application>

</manifest>
<think>好的,我现在遇到了一个关于Android开发的问题,需要解决。用户提到在使用startActivityForResult()时遇到了“Unresolved reference 'launch'”的错误。我需要仔细分析这个问题,找出可能的原因和解决方案。 首先,用户提到使用的是startActivityForResult().launch(intent),但遇到了未解析的引用错误。这说明在他们的代码中,launch方法无法被识别。根据我的知识,startActivityForResult()是一个传统的方法,通常需要传递请求码,并且通过重写onActivityResult()来处理结果。但在新的Android开发实践中,可能有一些变化。 我记得在Android Jetpack中,Activity Result API被引入来替代旧的startActivityForResult()方法。新的API使用了ActivityResultContracts和ActivityResultLauncher。用户可能尝试使用新的API,但代码结构不正确,导致launch方法无法找到。 用户提到的代码是startActivityForResult().launch(intent),这可能存在误解。正确的做法应该是先注册一个ActivityResultLauncher,然后调用其launch方法。例如,使用registerForActivityResult()来创建launcher实例,之后使用launcher.launch(intent)。 可能的错误原因包括: 1. 没有正确导入相关的类,如ActivityResultLauncher或ActivityResultContracts。 2. 没有正确初始化ActivityResultLauncher,直接调用startActivityForResult().launch(),而startActivityForResult()可能返回的不是一个具有launch方法的对象。 3. 使用了过时的方法,而项目配置中没有启用新的API。 解决方法应该是指导用户使用新的Activity Result API。需要检查他们的代码是否按照新的方式编写,例如是否注册了launcher,是否正确使用了registerForActivityResult,以及是否调用了launcher的launch方法。 另外,用户提到“无需手动传递请求码”,这正是新API的优势之一,不需要处理请求码,所以需要确认用户是否正确迁移到了新API,或者是否混合使用了新旧方法导致冲突。 总结步骤: 1. 引入ActivityResultContracts和ActivityResultLauncher。 2. 在Activity或Fragment中注册launcher。 3. 使用launcher的launch方法启动Activity。 4. 处理返回的结果在回调中,而不是在onActivityResult()。 需要将这些步骤详细解释给用户,并提供代码示例,确保他们正确使用新的API结构,避免旧的startActivityForResult()方法,从而解决未解析的引用错误。</think>在 Android 开发中,`startActivityForResult()` 的传统用法已逐渐被新的 **Activity Result API** 替代。当你看到 `Unresolved reference 'launch'` 错误时,通常是因为: ### 错误原因 1. **混淆新旧 API**:`startActivityForResult()` 是旧方法,需配合 `onActivityResult()` 使用,而 `launch()` 属于新的 Activity Result API。 2. **未正确初始化 Launcher**:新的 API 要求通过 `registerForActivityResult()` 注册 `ActivityResultLauncher` 对象,再调用其 `launch()` 方法。 --- ### 解决方案(使用新 API) #### 1. 定义 ActivityResultLauncher 在 `Activity` 或 `Fragment` 中注册一个结果监听器: ```kotlin // 第一步:声明 Launcher(建议在类成员变量中定义) private val myLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> // 处理返回结果 if (result.resultCode == RESULT_OK) { val data: Intent? = result.data // 解析 data } } ``` #### 2. 启动目标 Activity 使用 `launch()` 方法触发跳转: ```kotlin // 第二步:启动 Activity val intent = Intent(this, TargetActivity::class.java) myLauncher.launch(intent) // 无需手动传递请求码 ``` --- ### 新旧对比表 | **旧方法** | **新方法** | |------------|------------| | 需定义请求码(如 `REQUEST_CODE = 1`) | **无需请求码**,结果通过回调处理 | | 需重写 `onActivityResult()` | 直接在 `ActivityResultLauncher` 回调中处理结果 | | 代码分散,易耦合 | 逻辑集中,更易维护 | --- ### 常见问题排查 1. **未导入相关类**: 确保导入以下类: ```kotlin import androidx.activity.result.contract.ActivityResultContracts import androidx.activity.result.ActivityResultLauncher ``` 2. **作用域错误**: `registerForActivityResult()` 必须在 `Activity`/`Fragment` 生命周期初始化阶段调用(如 `onCreate()`)。 3. **Kotlin 扩展库依赖**: 检查 `build.gradle` 是否包含: ```gradle implementation "androidx.activity:activity-ktx:1.4.0" implementation "androidx.fragment:fragment-ktx:1.4.1" ``` --- ### 总结 - ✅ **新 API 优势**:避免请求码管理、代码更简洁、类型安全。 - ✅ **错误修复**:将旧式 `startActivityForResult()` 替换为 `ActivityResultLauncher` + `launch()`。 - ✅ **最佳实践**:始终使用 Android Jetpack 组件以兼容最新特性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值