2017-01-17 2 views
-2

Ich brauche Hilfe mit einem Fragment onclick Listener für meine logoutButton. Ich möchte meine gemeinsamen Einstellungen löschen und eine Absicht festlegen. Ich habe eine Menge Fragen zu SO gelesen, aber ich kann damit nicht umgehen. Ich habe es versucht wie in einer Aktivität von meiner App, aber es funktioniert nicht.Griff onclick in Fragmenten in android Studio

Es gibt viele Fehler sind:

  • Auf meiner Schaltfläche Erklärung: Kann nicht lösen Methode findViewById(int)
  • Auf mein Setup gemeinsamen Vorlieben: Kann Methode nicht lösen getSharedPreferences(java.lang.String, int)
  • Am finish() Aussage: Die Methode kann nicht lösen finish()
  • Bei meinem new Intent Konstruktor: Kann Konstruktor Intent(de.myfirstapp.app.SettingsFragment, java.lang.Class<de.myfirstapp.app.LoginActivity>)
  • nicht auflösen 210

package de.myfirstapp.app; 
 

 
import android.content.Context; 
 
import android.content.Intent; 
 
import android.content.SharedPreferences; 
 
import android.net.Uri; 
 
import android.os.Bundle; 
 
import android.support.v4.app.Fragment; 
 
import android.view.LayoutInflater; 
 
import android.view.View; 
 
import android.view.ViewGroup; 
 
import android.widget.Button; 
 
import android.widget.CalendarView; 
 
import android.widget.TextView; 
 

 
import static android.content.Context.MODE_PRIVATE; 
 

 
/** 
 
* A simple {@link Fragment} subclass. 
 
* Activities that contain this fragment must implement the 
 
* {@link SettingsFragment.OnFragmentInteractionListener} interface 
 
* to handle interaction events. 
 
* Use the {@link SettingsFragment#newInstance} factory method to 
 
* create an instance of this fragment. 
 
*/ 
 
public class SettingsFragment extends Fragment { 
 
    // TODO: Rename parameter arguments, choose names that match 
 
    // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER 
 
    private static final String ARG_PARAM1 = "param1"; 
 
    private static final String ARG_PARAM2 = "param2"; 
 

 
    // TODO: Rename and change types of parameters 
 
    private String mParam1; 
 
    private String mParam2; 
 

 
    private OnFragmentInteractionListener mListener; 
 

 
    public SettingsFragment() { 
 
     // Required empty public constructor 
 
    } 
 

 
    //Change the title in action bar 
 
    public void onResume(){ 
 
     super.onResume(); 
 
     String titleString = getResources().getString(R.string.title_activity_navigation_drawer_settings); 
 
     // Set title bar 
 
     ((NavigationDrawerActivity) getActivity()) 
 
       .setActionBarTitle(titleString); 
 
    } 
 

 
    /** 
 
    * Use this factory method to create a new instance of 
 
    * this fragment using the provided parameters. 
 
    * 
 
    * @param param1 Parameter 1. 
 
    * @param param2 Parameter 2. 
 
    * @return A new instance of fragment SettingsFragment. 
 
    */ 
 
    // TODO: Rename and change types and number of parameters 
 
    public static SettingsFragment newInstance(String param1, String param2) { 
 
     SettingsFragment fragment = new SettingsFragment(); 
 
     Bundle args = new Bundle(); 
 
     args.putString(ARG_PARAM1, param1); 
 
     args.putString(ARG_PARAM2, param2); 
 
     fragment.setArguments(args); 
 
     return fragment; 
 
    } 
 

 
    @Override 
 
    public void onCreate(Bundle savedInstanceState) { 
 
     super.onCreate(savedInstanceState); 
 
     if (getArguments() != null) { 
 
      mParam1 = getArguments().getString(ARG_PARAM1); 
 
      mParam2 = getArguments().getString(ARG_PARAM2); 
 
     } 
 

 
     //Logout button interaction 
 
     Button logoutButton = (Button) findViewById(R.id.logoutButton); 
 

 
     //Set onclick listener for the logout button 
 
     logoutButton.setOnClickListener(new View.OnClickListener() { 
 
      @Override 
 
      public void onClick(View view) { 
 
       // Deleting shared preferences for login activity 
 
       SharedPreferences loginPreferences = getSharedPreferences("loginPrefs", MODE_PRIVATE); 
 
       SharedPreferences.Editor editor = loginPreferences.edit(); 
 
       editor.clear(); 
 
       editor.commit(); 
 
       finish(); 
 

 
       // Launching login activity screen 
 
       Intent intentLogout = new Intent(SettingsFragment.this, LoginActivity.class); 
 
       SettingsFragment.this.startActivity(intentLogout); 
 
      } 
 

 
      ; 
 
     }); 
 
    } 
 

 
    @Override 
 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
 
          Bundle savedInstanceState) { 
 
     return inflater.inflate(R.layout.fragment_settings, container, false); 
 
    } 
 

 
    // TODO: Rename method, update argument and hook method into UI event 
 
    public void onButtonPressed(Uri uri) { 
 
     if (mListener != null) { 
 
      mListener.onFragmentInteraction(uri); 
 
     } 
 
    } 
 

 
    @Override 
 
    public void onAttach(Context context) { 
 
     super.onAttach(context); 
 
    } 
 

 
    @Override 
 
    public void onStart() { 
 
     super.onStart(); 
 
     try { 
 
      mListener = (OnFragmentInteractionListener) getActivity(); 
 
     } catch (ClassCastException e) { 
 
      throw new ClassCastException(getActivity().toString() 
 
        + " must implement OnFragmentInteractionListener"); 
 
     } 
 
    } 
 

 
    @Override 
 
    public void onDetach() { 
 
     super.onDetach(); 
 
     mListener = null; 
 
    } 
 

 
    /** 
 
    * This interface must be implemented by activities that contain this 
 
    * fragment to allow an interaction in this fragment to be communicated 
 
    * to the activity and potentially other fragments contained in that 
 
    * activity. 
 
    * <p> 
 
    * See the Android Training lesson <a href= 
 
    * "http://developer.android.com/training/basics/fragments/communicating.html" 
 
    * >Communicating with Other Fragments</a> for more information. 
 
    */ 
 
    public interface OnFragmentInteractionListener { 
 
     // TODO: Update argument type and name 
 
     void onFragmentInteraction(Uri uri); 
 
    } 
 
}

Sie meine onClick-Methode in der onCreate(Bundle savedInstanceState) Methode finden können. Danke, dass du mir aus der Dunkelheit geholfen hast :)

+2

Der beste Weg, Ihre Fragen zu lösen, zuerst lernen, wie man mit dem Fragment arbeiten und dann den Code aktualisieren. – buzzingsilently

+0

Wie hast du etwas gelernt? Über das machen. Und was mache ich hier? Ich lerne – ItsOdi1

+2

Ich meinte nur, dass Ihre Abfragen nur von Ihnen selbst lösbar sind. Also schauen Sie sich das Tutorial an und Sie werden das Problem verstehen. Entschuldigung, wenn Sie beleidigt waren. – buzzingsilently

Antwort

1

Ihr auf verschieben kli ck code zu onCreateView (...) Methode, Sie finden diese Schaltfläche in der aufgeblähten Ansicht, nicht im Fragment selbst.

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.fragment_settings, container, false); 

    //Logout button interaction 
    Button logoutButton = (Button) view.findViewById(R.id.logoutButton); 

    //Set onclick listener for the logout button 
    logoutButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      // Deleting shared preferences for login activity 
      SharedPreferences loginPreferences = getActivity().getSharedPreferences("loginPrefs", MODE_PRIVATE); 
      SharedPreferences.Editor editor = loginPreferences.edit(); 
      editor.clear(); 
      editor.commit(); 
      getActivity().finish(); 

      // Launching login activity screen 
      Intent intentLogout = new Intent(getActivity(), LoginActivity.class); 
      SettingsFragment.this.startActivity(intentLogout); 
     } 

     ; 
    }); 

    return view; 
} 

Andere Dinge funktionieren wird, wenn Sie vor getActivity() -Methode verwenden, wie:. getActivity() getSharedPreferences (...)

+0

Ich werde diesen Code jetzt ausprobieren :) Wenn ich es richtig verstehe, muss ich dies in der onCreateView tun, weil dies die Funktion ist, die nur Zugriff auf die Ansicht haben? – ItsOdi1

+1

Ja, du hast Recht :) –

+0

Es funktioniert super :) Ich habe einen AlertDialog eingefügt, um zu fragen, ob der Benutzer sich abmeldet und es funktioniert: D jippi – ItsOdi1

1

Fragment hat nicht die findViewById Methode. Sie sollten diese Methode in der Ansicht verwenden, die Sie zum Erstellen der Fragment aufgepumpt haben.

Wenn Sie die Ansicht aufblasen, um es zu einem Feld Variablenansicht speichern, und Ihre Ansichten dann von init:

view.findViewById(R.id.your_view);

2
  1. Verwenden onCreateView(..) statt onCreate()

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
        View view = inflater.inflate(R.layout.your_fragment_layout, container, false); 
        Button your_button = (Button) view.findViewById(R.id.your_button); 
        //... 
    } 
    
  2. Wenn Sie etwas aus dem Kontext verwenden möchten, verwenden Sie getContext(). Dann können Sie getContext().getSharedPreferences() oder neue Intent(getContext(), ...) anrufen. Wenn Sie etwas von Eltern Activity anrufen möchten, dann rufen Sie es über Rückrufe oder Activity Instanz über getActivity(). Zum Beispiel: getActivity().finish().

Aber all dies sind Grundlagen und Sie sollten Fragment und Support Fragment lesen.

1

in Ihrem `onCreateView den Button erklären wie unten

View view=inflater.inflate(R.layout.settings,container,false); 
Button logoutButton = (Button) view.findViewById(R.id.logoutButton); 

für finish(); Verwendung getActivity.finish();

Verwendung getActivity.getSharedPreferences für sharedpref

für Inten Service Gebrauch

Intent intentLogout = new Intent(getActivity(), LoginActivity.class); 
      getActivity().startActivity(intentLogout); 
1

Fragment der OnCreateView wie dieses hat.

Button logoutButton; 

     @Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
     View v = new View(getActivity());//you can access your button like this 
logoutButton=(Button)v.findViewById(R.id.logoutButton); 


    return v; 

Bitte lesen Sie this Sie verstehen können, wie mit fragments.hope dies hilft beschäftigen. :)

1

Get Schaltfläche Verweis in onCreateView

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.fragment_settings, container, false); 
    logoutButton = (Button) findViewById(R.id.logoutButton); 
    return view; 
} 

Um Einstellungen verwenden

zu erhalten geteilt
SharedPreferences loginPreferences = getActivity().getSharedPreferences("loginPrefs", MODE_PRIVATE); 

Um die Aktivität zu beenden, verschieben Sie sie unter Ihrem StartActivity-Aufruf.

getActivity().finish(); 

Absicht zum Erstellen

Intent intentLogout = new Intent(getActivity(), LoginActivity.class); 
Verwandte Themen