我最近将项目从
Eclipse移到了
Android Studio.我试图让电子邮件功能正常工作,但我收到“findViewById”错误.我也收到“Toast.makeText”的错误.你能帮忙解决这两个错误.我班上的代码如下:
package com.example.ishonours.witsbusapp; import android.app.Activity; import android.net.Uri; import android.os.Bundle; import android.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.content.Intent; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; public class ComplaintsFragment extends Fragment { //I added private EditText recipient; private EditText subject; private EditText body; private OnFragmentInteractionListener mListener; private static final String ARG_SECTION_NUMBER = "5"; public static ComplaintsFragment newInstance(int menuNumber) { ComplaintsFragment fragment = new ComplaintsFragment(); Bundle args = new Bundle(); args.putInt(ARG_SECTION_NUMBER,menuNumber); fragment.setArguments(args); return fragment; } public ComplaintsFragment() { // required empty public constructor } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState) { // Inflate the layout for this fragment return inflater.inflate(R.layout.fragment_complaints,container,false); //i added recipient = (EditText) findViewById(R.id.recipient); subject = (EditText) findViewById(R.id.subject); body = (EditText) findViewById(R.id.body); Button sendBtn = (Button) findViewById(R.id.sendEmail); sendBtn.setOnClickListener(new View.OnClickListener() { public void onClick(View view) { sendEmail(); // after sending the email,clear the fields recipient.setText(""); subject.setText(""); body.setText(""); } }); } //i added protected void sendEmail() { String[] recipients = {recipient.getText().toString()}; Intent email = new Intent(Intent.ACTION_SEND,Uri.parse("mailto:")); // prompts email clients only email.setType("message/rfc822"); email.putExtra(Intent.EXTRA_EMAIL,recipients); email.putExtra(Intent.EXTRA_SUBJECT,subject.getText().toString()); email.putExtra(Intent.EXTRA_TEXT,body.getText().toString()); try { // the user can choose the email client startActivity(Intent.createChooser(email,"Choose an email client from...")); } catch (android.content.ActivityNotFoundException ex) { Toast.makeText(ComplaintsFragment.this,"No email client installed.",Toast.LENGTH_LONG).show(); }} public void onButtonPressed(Uri uri) { if (mListener != null) { mListener.onFragmentInteraction(uri); } } @Override public void onAttach(Activity activity) { super.onAttach(activity); ((MainActivity) activity).onSectionAttached( getArguments().getInt(ARG_SECTION_NUMBER)); } @Override public void onDetach() { super.onDetach(); mListener = null; } public interface OnFragmentInteractionListener { // TODO: Update argument type and name public void onFragmentInteraction(Uri uri); }
}
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > tools:context="com.example.ishonours.witsbusapp.ComplaintsFragment"> <TextView android:id="@+id/text1" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginBottom="20dp" android:gravity="center" android:text="Complete the fields to log a complaint" android:textAppearance="?android:attr/textAppearanceMedium" /> <EditText android:id="@+id/recipient" android:layout_width="match_parent" android:layout_height="wrap_content" android:ems="10" android:inputType="textEmailAddress" android:hint="Recipient" /> <EditText android:id="@+id/subject" android:layout_width="match_parent" android:layout_height="wrap_content" android:ems="10" android:hint="Subject" /> <EditText android:id="@+id/body" android:layout_width="match_parent" android:layout_height="wrap_content" android:ems="10" android:hint="Message body" /> <Button android:id="@+id/sendEmail" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginTop="30dp" android:text="Compose an email" />
解决方法
问题出在你的onCreateView方法中.
@Override public View onCreateView(LayoutInflater inflater,Bundle savedInstanceState) { // Inflate the layout for this fragment View v = inflater.inflate(R.layout.fragment_complaints,false); //i added recipient = (EditText) v.findViewById(R.id.recipient); [...] return v; }
看到不同?在碎片的情况下,您必须在实际的View对象上调用findViewById.
你有Toast的问题是因为你传递了worng对象作为第一个参数.你需要Context而你正在传递Fragment.片段不是一个上下文但幸运的是你的活动就是这样,你必须像这样构建你的Toast:
Toast.makeText(ComplaintsFragment.this.getActivity(),Toast.LENGTH_LONG).show();
注意getActivity()调用.