2016-04-07 12 views
2

In meiner App habe ich Navigationsschublade in Hauptaktivität mit 3 Fragmenten. Wenn ich auf jedes Element im Menü klicke, wird das Fragment geladen. hier hat jedes Fragment viele Texte. Im zweiten Fragment übergebe ich das Formular (erste Fragmentwerte + zweite Fragmentfelder). Wie validiere ich den ersten Text des Fragments mit gesetztem Fehler?Text-Validierungen in Fragmenten bearbeiten Android

Ich kann Set-Fehler nach Fragment-Transaktion zu ersten Fragment nicht festlegen. mache ich etwas falsch.

Code für Fragment wie unten

FpcDetailsFragment detailsFragment = new FpcDetailsFragment(); 
    getFragmentManager().beginTransaction().replace(R.id.content_frame, detailsFragment).addToBackStack(null).commit(); 
      MainActivity.mDrawerLayout.closeDrawer(GravityCompat.START); 

Antwort

0

Für jede submittion richtige Validierung auf Tastensatz wie unten klicken:

btn_submit.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        View focusView = null; 
        boolean cancelLogin = false; 
        fname = edt_first_name.getText().toString(); 
        lname = edt_last_name.getText().toString(); 
        user_email = edt_email.getText().toString(); 
        user_phn = edt_primary_contact.getText().toString(); 


        if (TextUtils.isEmpty(fname)) { 
         edt_first_name.setError(getString(R.string.userName_required)); 
         focusView = edt_first_name; 
         cancelLogin = true; 
        } 
        if (TextUtils.isEmpty(lname)) { 
         edt_last_name.setError(getString(R.string.userName_required)); 
         focusView = edt_last_name; 
         cancelLogin = true; 
        } 


        if (TextUtils.isEmpty(user_email)) { 
         edt_email.setError(getString(R.string.email_required)); 
         focusView = edt_email; 
         cancelLogin = true; 
        } else if (!isValidEmail(user_email)) { 
         edt_email.setError(getString(R.string.invalid_email)); 
         focusView = edt_email; 
         cancelLogin = true; 
        } 
        if (TextUtils.isEmpty(user_phn) & !isValidPhone((user_phn))) { 
         edt_primary_contact.setError(getString(R.string.phone_required)); 
         focusView = edt_primary_contact; 
         cancelLogin = true; 
        } 
        if (cancelLogin) { 
         // error in login 
         focusView.requestFocus(); 
        } else { 
         editProfile(); 
        } 

       }}); 

erstellen Methoden für chekcs:

private boolean isValidEmail(String email) { 
     String EMAIL_PATTERN = "^[_A-Za-z0-9-\\+]+(\\.[_A-Za-z0-9-]+)*@" 
       + "[A-Za-z0-9-]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$"; 

     Pattern pattern = Pattern.compile(EMAIL_PATTERN); 
     Matcher matcher = pattern.matcher(email); 
     return matcher.matches(); 
    } 

    private boolean isValidPhone(String pass) { 
     return pass != null && pass.length() == 10; 
    } 

Danach die Werte, die Sie vom ersten Fragment erhalten, senden Sie durch Bündel wie:

Fragment fr=new FpcDetailsFragment(); 
FragmentManager fm=getFragmentManager(); 
android.app.FragmentTransaction ft=fm.beginTransaction(); 
Bundle args = new Bundle(); 
args.putString("username", fname+ " "+lname); 
fr.setArguments(args); 
ft.replace(R.id.content_frame, fr); 
ft.commit(); 

und die Daten werden anhand der folgenden

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
    String strtext = getArguments().getString("username");  
    return inflater.inflate(R.layout.fragment, container, false); 
} 
+0

Danke für die Antwort. Willst du auf jedes Fragment validieren, wenn du zum nächsten Fragment gehst? .. aber ich validiere die frag1 und frag2 Details nur in Fragment 2. wenn irgendwas falsch ist 1 fragment2, kann ich dort selbst eine fehlermeldung anzeigen (fragment2) .. wenn irgendwas in fragment 1 falsch ist, sollte ich nach farg1 gehen und die fehlermeldung auf bestimmten feldern zeigen. hier zeigt es nicht. – saravanan

+0

@saravanan Ja, Sie müssen nur Werte für dieses bestimmte Fragment validieren. Der Code, den ich gepostet habe, funktioniert perfekt für diesen Zweck. –

+0

ok danke. aber der Benutzer kann die Fragmente sequentiell durch vorwärts und rückwärts besuchen. es kann den Benutzer jedes Mal irritieren, wenn er die Felder bestätigt. als meine Anforderung ist, fragment1 und fragment 2 Werte nur in Fragment 2 einzureichen ... gibt es einen Weg? .. das Problem liegt nach dem erneuten Laden von fragment1, ich kann setError nicht auf bestimmte Felder setzen. wie man fragment1 einfach aufruft, ohne es neu zu laden. pls – saravanan

0

Ich weiß nicht, die Art der Informationen, die Sie validieren mögen erhalten, aber Sie können eine Singleton-Klasse verwenden, die die Informationen von Fragmente enthält 1 und Fragment 2, und wenn Sie Ihr Formular senden möchten, können Sie einfach die Informationen aus dieser Klasse erhalten und validieren.

EDIT:

Können sagen, wir haben fragmenta, FragmentB und ein Singleton DataBuilder, die die Daten aus den beiden Fragmente enthält. In FragmentA können Sie alle Ihre Daten im DataBuilder speichern und den Benutzer zu FragmentB navigieren. Dann müssen Sie die Daten erst validieren, bevor Sie sie übergeben. Und wenn die Validierung für FragmentA falsch ist, navigieren Sie einfach zurück zum FragmentA und zeigen Sie eine Nachricht an.

fragmenta:

package aero.djetops; 


import android.os.Bundle; 
import android.support.annotation.Nullable; 
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.EditText; 

public class FragmentA extends Fragment{ 

private EditText firstInput; 
private EditText secondInput; 
private EditText thirdInput; 
private Button bContinue; 


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

    firstInput = (EditText) rootView.findViewById(R.id.first_input); 
    secondInput = (EditText) rootView.findViewById(R.id.second_input); 
    thirdInput = (EditText) rootView.findViewById(R.id.third_input); 


    // populate the inputs with the data from DataBuilder 
    firstInput.setText(DataBuilder.getInstance().getFragmentA_firstInputData()); 
    secondInput.setText(DataBuilder.getInstance().getFragmentA_secondInputData()); 
    thirdInput.setText(DataBuilder.getInstance().getFragmentA_thirdInputData()); 

    bContinue.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      DataBuilder.getInstance().setFragmentA_firstInputData(firstInput.getText().toString()); 
      DataBuilder.getInstance().setFragmentA_secondInputData(secondInput.getText().toString()); 
      DataBuilder.getInstance().setFragmentB_thirdInputData(thirdInput.getText().toString()); 

      FragmentB fragmentB = new FragmentB(); 
      getFragmentManager().beginTransaction().replace(R.id.content_frame, fragmentB) 
        .addToBackStack(null).commit(); 
     } 
    }); 


    return rootView; 
} 

}

FragmentB:

package aero.djetops; 


import android.os.Bundle; 
import android.support.annotation.Nullable; 
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.EditText; 

public class FragmentB extends Fragment{ 

    private EditText firstInput; 
    private EditText secondInput; 
    private EditText thirdInput; 
    private Button bSubmit; 


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

     firstInput = (EditText) rootView.findViewById(R.id.first_input); 
     secondInput = (EditText) rootView.findViewById(R.id.second_input); 
     thirdInput = (EditText) rootView.findViewById(R.id.third_input); 


     // populate the inputs with the data from DataBuilder 
     firstInput.setText(DataBuilder.getInstance().getFragmentB_firstInputData()); 
     secondInput.setText(DataBuilder.getInstance().getFragmentB_secondInputData()); 
     thirdInput.setText(DataBuilder.getInstance().getFragmentB_thirdInputData()); 

     bSubmit.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       DataBuilder.getInstance().setFragmentB_firstInputData(firstInput.getText().toString()); 
       DataBuilder.getInstance().setFragmentB_secondInputData(secondInput.getText().toString()); 
       DataBuilder.getInstance().setFragmentB_thirdInputData(thirdInput.getText().toString()); 

       if(validateDataFragmentA()) { 
        showErrorMessage(); 
        FragmentA fragmentA = new FragmentA(); 
        getFragmentManager().beginTransaction().replace(R.id.content_frame, fragmentA) 
          .addToBackStack(null).commit(); 
        return; 
       } else if(validateDataFragmentB()) { 
        showErrorMessage(); 
        return; 
       } 

       // everything is ok 
       // submit data here 
      } 
     }); 


     return rootView; 
    } 
} 

DataBuilder:

package aero.djetops; 

public class DataBuilder { 
    private static DataBuilder ourInstance = new DataBuilder(); 

    public static DataBuilder getInstance() { 
     return ourInstance; 
    } 

    // fragment A 
    private String fragmentA_firstInputData; 
    private String fragmentA_secondInputData; 
    private String fragmentA_thirdInputData; 


    // fragment B 
    private String fragmentB_firstInputData; 
    private String fragmentB_secondInputData; 
    private String fragmentB_thirdInputData; 


    private DataBuilder() { 
     fragmentA_firstInputData = ""; 
     fragmentA_secondInputData = ""; 
     fragmentA_thirdInputData = ""; 
     fragmentB_firstInputData = ""; 
     fragmentB_secondInputData = ""; 
     fragmentB_thirdInputData = ""; 
    } 


    /** 
    * Clear the data in the builder 
    */ 
    public void clearInputData() { 
     fragmentA_firstInputData = ""; 
     fragmentA_secondInputData = ""; 
     fragmentA_thirdInputData = ""; 
     fragmentB_firstInputData = ""; 
     fragmentB_secondInputData = ""; 
     fragmentB_thirdInputData = ""; 
    } 


    // GETTERS and SETTERS 

    public String getFragmentA_firstInputData() { 
     return fragmentA_firstInputData; 
    } 

    public void setFragmentA_firstInputData(String fragmentA_firstInputData) { 
     this.fragmentA_firstInputData = fragmentA_firstInputData; 
    } 

    public String getFragmentA_secondInputData() { 
     return fragmentA_secondInputData; 
    } 

    public void setFragmentA_secondInputData(String fragmentA_secondInputData) { 
     this.fragmentA_secondInputData = fragmentA_secondInputData; 
    } 

    public String getFragmentA_thirdInputData() { 
     return fragmentA_thirdInputData; 
    } 

    public void setFragmentA_thirdInputData(String fragmentA_thirdInputData) { 
     this.fragmentA_thirdInputData = fragmentA_thirdInputData; 
    } 

    public String getFragmentB_firstInputData() { 
     return fragmentB_firstInputData; 
    } 

    public void setFragmentB_firstInputData(String fragmentB_firstInputData) { 
     this.fragmentB_firstInputData = fragmentB_firstInputData; 
    } 

    public String getFragmentB_secondInputData() { 
     return fragmentB_secondInputData; 
    } 

    public void setFragmentB_secondInputData(String fragmentB_secondInputData) { 
     this.fragmentB_secondInputData = fragmentB_secondInputData; 
    } 

    public String getFragmentB_thirdInputData() { 
     return fragmentB_thirdInputData; 
    } 

    public void setFragmentB_thirdInputData(String fragmentB_thirdInputData) { 
     this.fragmentB_thirdInputData = fragmentB_thirdInputData; 
    } 
} 
+0

Danke für die Antwort. Hier kann die Validierung leicht durchgeführt werden. Wenn Fehler bei den Validierungen in Fragment1 auftreten, sollte ich dorthin gehen und setError nicht auf ein bestimmtes edittext-Feld setzen. – saravanan

+0

@saravanan, können Sie die Antwort erneut überprüfen. Ich habe ein Beispiel hinzugefügt, das hilfreich sein kann, hoffe ich :) –

+0

danke für die Antwort ... lass mich versuchen ... – saravanan

0

getView() -Methode gibt die aktuelle Ansicht des Fragments zurück. es wird leicht, dort auf Elemente zuzugreifen

public class SettingFragment extends Fragment implements View.OnClickListener { 
Context context; 

Button btnChangePwd, btnDeleteAccount; 
EditText evNewPwd, evConformPwd; 

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

// TODO: Rename and change types and number of parameters 
public static SettingFragment newInstance(Context context) { 
    SettingFragment fragment = new SettingFragment(); 
    fragment.context = context; 
    return fragment; 
} 

@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 
    View view =inflater.inflate(R.layout.fragment_setting, container, false); 
    evNewPwd = (EditText)view.findViewById(R.id.setting_et_newpwd); 
    evConformPwd = (EditText)view.findViewById(R.id.setting_et_repeatpwd); 
    btnChangePwd = (Button)view.findViewById(R.id.setting_btn_changepwd); 
    btnDeleteAccount = (Button)view.findViewById(R.id.setting_btn_delete); 

    btnChangePwd.setOnClickListener(this); 
    btnDeleteAccount.setOnClickListener(this); 
    return view; 
} 

@Override 
public void onClick(View v) { 
    try { 
     switch (v.getId()) { 
      case R.id.setting_btn_changepwd: 
       TextView tv = getView().findViewById(R.id.tvName); 
       if(tv.getText().toString().equals("User"))) { 
        Toast.makeText(context,"Match", Toast.LENGTH_LONG).show(); 
       }else{ 
        tv.setError("error"); 
       } 
       break; 
     } 
    }catch (Exception ex){ 
     ex.printStackTrace(); 
    } 
} 
} 
Verwandte Themen