Intereting Posts
Почему папка «data» не может отображаться так же, как в проводнике файлов DDMS? Как проверяются разрешения безопасности Android во время выполнения? Текст строки состояния уведомлений Захват камеры без предварительного просмотра в Android 2.2 Android Webview, сделать URL-адреса открытыми в разных браузерах Как сохранить постоянный CSS в WebView Ошибка Android: невозможно добавить окно – токен null не для приложения Прокрутка в горизонтальном ScrollView теряет фокус сфокусированного элемента, Экран «Шерлок» + «Список фрагментов» + «Фрагменты» Ошибка: атрибут «цвет» уже определен, обновить appcompat v-7 Андроид устанавливает границы для одного слоя слоя, пригодного для рисования Проект Android появляется с дублирующимся приложением после развертывания Странное поведение тени во время флип-карты Недействительное значение по умолчанию для Android Numberpicker Как выравнивать элементы по горизонтали внутри LinearLayout?

Как «findViewById» с фрагментами?

Недавно я перенес свой проект в Android Studio из Eclipse. Я пытаюсь получить работу электронной почты, но я получаю ошибки с помощью «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); } 

}

Код в моем файле xml:

 <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, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment View v = inflater.inflate(R.layout.fragment_complaints, container, false); //i added recipient = (EditText) v.findViewById(R.id.recipient); [...] return v; } 

Увидеть разницу? Вы должны вызвать findViewById на фактическом объекте View в случае Fragments .

И проблема с Toast вас есть, потому что вы передаете объект worng в качестве первого параметра. Вам нужен Context и вы передаете Fragment . Fragment – это не Context но, к счастью, для вас. Activity в этом, вам нужно построить свой Toast следующим образом:

 Toast.makeText(ComplaintsFragment.this.getActivity(), "No email client installed.", Toast.LENGTH_LONG).show(); 

Обратите внимание, что getActivity() .

Поэтому ваш метод onCreateView должен выглядеть так:

 @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.fragment_complaints, container, false); recipient = (EditText) rootView.findViewById(R.id.recipient); subject = (EditText) rootView.findViewById(R.id.subject); body = (EditText) rootView.findViewById(R.id.body); Button sendBtn = (Button) rootView.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(""); } }); return rootView; }