2015-08-10 15 views
6

Niedawno przeniosłem swój projekt do Android Studio z Eclipse. Próbuję uruchomić działanie poczty e-mail, ale otrzymuję błędy przez "findViewById". Otrzymuję również błędy przez "Toast.makeText". Czy mógłbyś pomóc przy obu błędach? Kod w mojej klasie jest następujący:Jak mogę "findViewById" z fragmentami?

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); 
} 

}

kod w moim pliku XML jest:

<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" /> 

+0

Możliwy duplikat [findViewById in Fragment] (http://stackoverflow.com/questions/6495898/findviewbyid-in-fragment) – Sufian

Odpowiedz

4

Więc onCreateView metoda powinna wyglądać następująco:

@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; 
} 
10

Problem jest w twojej metodzie 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; 
} 

Widzisz różnicę? Musisz zadzwonić pod numer findViewById na rzeczywisty obiekt View w przypadku Fragments.

A problem z Toast masz, ponieważ przekazujesz obiekt worng jako pierwszy parametr. Potrzebujesz Context i mijasz Fragment. Fragment nie jest Context ale Na szczęście dla ciebie Activity jest tak, trzeba budować swojej Toast takiego:

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

pamiętać, że getActivity() połączenia.

+0

Widzę różnicę. Wielkie dzięki chłopaki! Każdy pomysł, dlaczego "Toast.makeText" nie działa? – Yusuf

+0

Jaki jest komunikat o błędzie, który otrzymujesz? także, przekaż odpowiedzi, jeśli je polubisz – pelotasplus

+0

Pewnie to zrobi. nie można rozwiązać method'makeText (theprojectname.CompalintsFragment, .lang.String, int) ' – Yusuf

Powiązane problemy