Android 从碎片活动联系人表单发送电子邮件

Android 从碎片活动联系人表单发送电子邮件,android,forms,email,fragment,Android,Forms,Email,Fragment,我知道已经有人问过类似的问题,但即使在研究了其他人的问题之后,我仍然无法让我的代码正常工作,主要是因为项目之间的差异使我很难理解做什么和如何做 通常这是可行的,但是表单是在一个片段活动中,所以我很自然地遇到了几个问题(有些问题我已经解决了,有些问题没有解决),这是因为片段没有扩展这个或那个等等 package com.example; import android.app.Fragment; import android.content.Intent; import android.os.Bu

我知道已经有人问过类似的问题,但即使在研究了其他人的问题之后,我仍然无法让我的代码正常工作,主要是因为项目之间的差异使我很难理解做什么和如何做

通常这是可行的,但是表单是在一个片段活动中,所以我很自然地遇到了几个问题(有些问题我已经解决了,有些问题没有解决),这是因为片段没有扩展这个或那个等等

package com.example;

import android.app.Fragment;
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.Toast;

public class Fragment1 extends Fragment{

@Override
public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState){
    setHasOptionsMenu(true);
    View fragment1View=inflater.inflate(R.layout.fragment1,container,false);
    return fragment1View;

}

public void sendEmail(View button){
    final EditText formName=(EditText)findViewById(R.id.formName);
    String clientName=formName.getText().toString();
    final EditText formEmail=(EditText)findViewById(R.id.formEmail);
    String clientEmail=formEmail.getText().toString();
    final EditText formDetails=(EditText)findViewById(R.id.formDetails);
    String clientDetails=formDetails.getText().toString();

    Intent i = new Intent(Intent.ACTION_SEND);
    i.setType("message/rfc822");
    i.putExtra(Intent.EXTRA_EMAIL,new String[]{"example@email.com"});
    i.putExtra(Intent.EXTRA_SUBJECT, "New Private Service Request");
    i.putExtra(Intent.EXTRA_TEXT, "TODO: compose message body");
    try {
        startActivity(Intent.createChooser(i, "Send email with...?"));
    } catch (android.content.ActivityNotFoundException exception) {
        Toast.makeText(Fragment1.this.getActivity(), "No email clients installed on device!", Toast.LENGTH_LONG).show();
    }
}
}

基本上,EditText控件的findViewById都被下划线为错误:“Fragment1类型的findViewById(int)方法未定义”。 我试过这个:

final EditText formName=(EditText)fragment1View.findViewById(R.id.formName);
虽然这可能对一些人有所帮助,但对我来说,fragment1View根本无法解决,尽管我已经在onCreateView中声明了它


我尝试了很多事情,只是不知道该怎么办。我想放弃,用一个标准的活动代替片段,但它必须是片段。请提供帮助:/

您需要为要在片段中找到的每个视图创建字段。然后在
onCreateView
中编写如下内容:

    Button button;
    @Override
    public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState){
        setHasOptionsMenu(true);
        View fragment1View=inflater.inflate(R.layout.fragment1,container,false);
        button = (Button) fragment1View.findViewById(R.id.button);
        return fragment1View;
    }

不能在片段中使用
findVIewById
。但您可以在onCreateView中使用它,onCreateView实际上是片段的布局。

解决方案是在定义和初始化edittext define视图时使用它。 例如:

最终EditText formName=(EditText)fragment1View.findViewById(R.id.formName)

每当您初始化片段中的按钮时执行此操作。:)
愉快的编码。

所以在处理片段活动时,我必须首先将视图声明为全局变量,然后在onCreate方法中为每个视图创建字段?这是否意味着,在sendEmail()方法中,我可以毫不费力地从视图中收集值,然后处理它们(String clientName=formName.getText().toString();),而无需另外调用视图?谢谢你!:)您也不能为每个视图创建一个新字段,而是保留一个对您在onCreateView方法中膨胀的片段视图的引用,然后在需要时在其视图层次结构中找到合适的视图。嗯,第二种解释对我来说有点抽象,没有示例(我还是新手),但重要的是,你们的回答已经为我做到了。该应用程序工作正常。非常感谢,伙计;)