2015-08-10 15 views
6

Recentemente ho spostato il mio progetto su Android Studio da Eclipse. Sto cercando di far funzionare la funzionalità email, tuttavia ricevo errori da "findViewById". Ricevo anche errori da "Toast.makeText". Potresti per favore assistere su entrambi gli errori. Il codice della mia classe è la seguente:Come si "trovaViewById" con i frammenti?

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

}

Il codice nel mio file 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" /> 

+0

Possibile duplicato di [findViewById in Fragment] (http://stackoverflow.com/questions/6495898/findviewbyid-in-fragment) – Sufian

risposta

4

Così il vostro metodo di onCreateView dovrebbe essere simile:

@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

Il problema è nel tuo metodo 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; 
} 

Vedere la differenza? Devi chiamare findViewById sull'oggetto effettivo View in caso di Fragments.

E il problema con Toast è dovuto al fatto che si passa l'oggetto worng come primo parametro. Hai bisogno di Context e stai passando Fragment. Fragment non è un Context ma fortunatamente per voi Activity è così, si deve costruire il vostro Toast in questo modo:

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

noti che getActivity() chiamata.

+0

Vedo la differenza. Molte grazie, ragazzi! Qualche idea sul perché il "Toast.makeText" non funzioni? – Yusuf

+0

qual è il messaggio di errore che ottieni? Inoltre, rispondi alle risposte se ti piacciono allo stesso modo – pelotasplus

+0

Sure lo farà. non è possibile risolvere method'makeText (theprojectname.CompalintsFragment, .lang.String, int) ' – Yusuf