0

J'ai développé une application qui comprend l'enregistrement de connexion, GPS et scanner QR. Maintenant, j'ai mon code QR scan dans le profilefragment.java et je l'appelle de mainactivity.java.Le bouton pour QR scan est dans le profilefragment.xml et l'activité principale a mainactivity.java qui a le bloc try catch. Au lieu d'aller dans le bloc try-catch, il montre le message toast. De plus, le format de chaîne généré par QR est correct.Définir TextView au lieu de toast de fragment en activité

code QR pour analyser dans le fragment de profil (résultat d'analyse QR dans le principal activity.java)

public class ProfileFragment extends Fragment implements View.OnClickListener { 

private TextView tv_name, tv_email, tv_message; 
private SharedPreferences pref; 
private AppCompatButton btn_change_password, btn_logout; 
private EditText et_old_password, et_new_password; 
private AlertDialog dialog; 
private ProgressBar progress; 
private Button buttonScan, Nextbutton; 
private TextView textViewUnique; 
private IntentIntegrator qrScan; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

    View view = inflater.inflate(R.layout.fragment_profile, container, false); 


    initViews(view); 
    return view; 
} 

@Override 
public void onViewCreated(View view, Bundle savedInstanceState) { 

    pref = getActivity().getPreferences(0); 
    tv_name.setText("Welcome : " + pref.getString(Constants.NAME, "")); 
    tv_email.setText(pref.getString(Constants.EMAIL, "")); 

} 

private void initViews(View view) { 

    tv_name = (TextView) view.findViewById(R.id.tv_name); 
    tv_email = (TextView) view.findViewById(R.id.tv_email); 
    btn_change_password = (AppCompatButton) view.findViewById(R.id.btn_chg_password); 
    btn_logout = (AppCompatButton) view.findViewById(R.id.btn_logout); 
    buttonScan = (Button) view.findViewById(R.id.buttonScan); 
    Nextbutton = (Button) view.findViewById(R.id.Next); 
    textViewUnique = (TextView) view.findViewById(R.id.textViewUniqueId); 
    btn_change_password.setOnClickListener(this); 
    btn_logout.setOnClickListener(this); 
    buttonScan.setOnClickListener(this); 
    qrScan = new IntentIntegrator(getActivity()); 
    Nextbutton.setOnClickListener(this); 

} 


private void showDialog() { 

    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 
    LayoutInflater inflater = getActivity().getLayoutInflater(); 
    View view = inflater.inflate(R.layout.dialog_change_password, null); 
    et_old_password = (EditText) view.findViewById(R.id.et_old_password); 
    et_new_password = (EditText) view.findViewById(R.id.et_new_password); 
    tv_message = (TextView) view.findViewById(R.id.tv_message); 
    progress = (ProgressBar) view.findViewById(R.id.progress); 
    builder.setView(view); 
    builder.setTitle("Change Password"); 
    builder.setPositiveButton("Change Password", new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialog, int which) { 

     } 
    }); 
    builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialog, int which) { 
      dialog.dismiss(); 
     } 
    }); 
    dialog = builder.create(); 
    dialog.show(); 
    dialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      String old_password = et_old_password.getText().toString(); 
      String new_password = et_new_password.getText().toString(); 
      if (!old_password.isEmpty() && !new_password.isEmpty()) { 

       progress.setVisibility(View.VISIBLE); 
       changePasswordProcess(pref.getString(Constants.EMAIL, ""), old_password, new_password); 

      } else { 

       tv_message.setVisibility(View.VISIBLE); 
       tv_message.setText("Fields are empty"); 
      } 
     } 
    }); 
} 

@Override 
public void onClick(View v) { 
    switch (v.getId()) { 

     case R.id.btn_chg_password: 
      showDialog(); 
      break; 
     case R.id.btn_logout: 
      logout(); 
      break; 
     case R.id.buttonScan: 
      qrScan.initiateScan(); 
      break; 
     case R.id.Next: 
      Intent intent = new Intent(getActivity(), MapMainActivity.class); 
      getActivity().startActivity(intent); 
      break; 
    } 
} 

private void logout() { 
    SharedPreferences.Editor editor = pref.edit(); 
    editor.putBoolean(Constants.IS_LOGGED_IN, false); 
    editor.putString(Constants.EMAIL, ""); 
    editor.putString(Constants.NAME, ""); 
    editor.putString(Constants.UNIQUE_ID, ""); 
    editor.apply(); 
    goToLogin(); 
} 

private void goToLogin() { 

    Fragment login = new LoginFragment(); 
    FragmentTransaction ft = getFragmentManager().beginTransaction(); 
    ft.replace(R.id.fragment_frame, login); 
    ft.commit(); 
} 

private void changePasswordProcess(String email, String old_password, String new_password) { 

    Retrofit retrofit = new Retrofit.Builder() 
      .baseUrl(Constants.BASE_URL) 
      .addConverterFactory(GsonConverterFactory.create()) 
      .build(); 

    RequestInterface requestInterface = retrofit.create(RequestInterface.class); 

    User user = new User(); 
    user.setEmail(email); 
    user.setOld_password(old_password); 
    user.setNew_password(new_password); 
    ServerRequest request = new ServerRequest(); 
    request.setOperation(Constants.CHANGE_PASSWORD_OPERATION); 
    request.setUser(user); 
    Call<ServerResponse> response = requestInterface.operation(request); 

    response.enqueue(new Callback<ServerResponse>() { 
     @Override 
     public void onResponse(Call<ServerResponse> call, retrofit2.Response<ServerResponse> response) { 

      ServerResponse resp = response.body(); 
      if (resp.getResult().equals(Constants.SUCCESS)) { 
       progress.setVisibility(View.GONE); 
       tv_message.setVisibility(View.GONE); 
       dialog.dismiss(); 
       Snackbar.make(getView(), resp.getMessage(), Snackbar.LENGTH_LONG).show(); 

      } else { 
       progress.setVisibility(View.GONE); 
       tv_message.setVisibility(View.VISIBLE); 
       tv_message.setText(resp.getMessage()); 

      } 
     } 

     @Override 
     public void onFailure(Call<ServerResponse> call, Throwable t) { 

      Log.d(Constants.TAG, "failed"); 
      progress.setVisibility(View.GONE); 
      tv_message.setVisibility(View.VISIBLE); 
      tv_message.setText(t.getLocalizedMessage()); 

     } 

    }); 
} 

}

mainactivity.java

public class MainActivity extends FragmentActivity { 
private TextView textViewUnique; 

public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) 
{ 
View view = inflater.inflate(R.layout.fragment_profile,container,false); 
TextView textViewUnique = (TextView) view.findViewById(R.id.textViewUniqueId); 
//return inflater.inflate(R.layout.fragment_profile, container); 
return view; 

} 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
setContentView(R.layout.activity_main); 
textViewUnique = (TextView) findViewById(com.learn2crack.loginregistration.R.id.textViewUniqueId); 
pref = getPreferences(0); 
initFragment(); 
} 
private void initFragment() { 
Fragment fragment; 
if (pref.getBoolean(Constants.IS_LOGGED_IN, false)) { 
fragment = new ProfileFragment(); 
} else { 
    fragment = new LoginFragment(); 
} 
FragmentTransaction ft = getFragmentManager().beginTransaction(); 
ft.replace(R.id.fragment_frame, fragment); 
ft.commit(); 
} 
@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
IntentResult result = IntentIntegrator.parseActivityResult(requestCode, resultCode, data); 
if (result != null) { 
//if qrcode has nothing in it 
if (result.getContents() == null) { 
Toast.makeText(this, "Result Not Found", Toast.LENGTH_LONG).show(); 
} else { 
//if qr contains data 
try { 
ProfileFragment profileFragment = new ProfileFragment(); 
profileFragment.onActivityResult(requestCode, resultCode, data); 
JSONObject obj = new JSONObject(result.getContents()); 
textViewUnique.setText(obj.getString("unique_id")); 
//textViewUnique.setText(obj.getString("unique id")); 
} catch (Exception e) { 
e.printStackTrace(); 
//if control comes here 
//that means the encoded format not matches 
//in this case you can display whatever data is available on the qrcode 
//to a toast 
Toast.makeText(this, result.getContents(), Toast.LENGTH_LONG).show(); 
} 
} 
} else { 
super.onActivityResult(requestCode, resultCode, data); 
} 
} 
} 

Les deux XML sont

activitymain.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.learn2crack.loginregistration.MainActivity"> 
<FrameLayout 
android:id="@+id/fragment_frame" 
android:layout_width="match_parent" 
android:layout_height="match_parent"/> 
</LinearLayout> 
</android.support.design.widget.CoordinatorLayout> 

profil fragment.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/activity_main" 
android:orientation="vertical" 
android:layout_marginLeft="40dp" 
android:layout_marginRight="40dp" 
android:gravity="center" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:baselineAligned="false"> 

<Button 
android:id="@+id/buttonScan" 
android:layout_width="104dp" 
android:layout_height="wrap_content" 
android:text="QR Scan" 
android:layout_gravity="right" /> 
<TextView 
android:layout_width="match_parent" 
android:layout_height="wrap_content" 
android:text="unique_id" 
android:textSize="20dp" /> 
<TextView 
android:id="@+id/textViewUniqueId" 
android:layout_marginTop="10dp" 
android:textSize="20sp" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:layout_gravity="center_horizontal"/> 
</LinearLayout> 

Répondre

0

En supposant que votre fragmenter est remplacé dans le récipient de votre MainActivity qui est fragment_frame dans votre code.
Deux étapes que nous allons suivre -

1) Créer méthode publique à votre activity-à-dire MainActivity dans votre cas

public void setRequiredText(String text) { 
    if(textViewUnique != null) { 
     textViewUnique.setText(text); 
    } 
} 

2) appeler la méthode de MainActivity de votre Fragment mettre à jour TextView

Activity act = getActivity(); // Get activity to which your fragment is attached 
if (act instanceof MainActivity) { 
    ((MainActivity) act).setRequiredText(obj.getString("unique_id")) 
} 

Et vous avez terminé.