0

我一直在開發一個應用程序,其中包括登錄註冊,GPS和QR掃描儀。 現在我在profilefragment.java中有我的QR掃描代碼,我從mainactivity.java調用它.QR掃描的按鈕位於profilefragment.xml中,主要活動有mainactivity.java,它具有try catch塊。而不是去嘗試catch塊它顯示敬酒信息。 QR生成的字符串格式也是正確的。設置TextView而不是從活動中的片段吐司

代碼QR輪廓片段掃描(QR掃描結果在主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); 
} 
} 
} 

兩個XML是

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> 

輪廓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> 

回答

0

假設你的片段被替換您的MainActivity的容器,它是在你的代碼fragment_frame
兩個步驟,我們要遵循 -

1)你的情況

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

2)呼叫MainActivity的方法從Fragment更新創建公共方法您activityMainActivityTextView

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

你完成了。