![](/img/trans.png)
[英]How to change fragment from the Recycler View OnClick Listener when RecyclerView item is clicked using Navigation Components
[英]How to change username in navigation header using data from fragment?
我正在尝试在用户登录应用程序时更改导航标题。 登录用户后,用户名和图片应更改。 我尝试使用共享首选项中的id进行操作,但它可以正常工作,但是当我尝试从本地数据库获取数据时会崩溃。
我试图从登录片段中获取数据是否有问题? 还是即时通讯试图在错误的地方获取数据?
当我从MainActivity更改用户名和图片时,它会更改,因此我认为问题出在片段登录中。
该代码可以正常工作,直到我尝试从本地数据库获取数据为止:
mpet.project2018.air.database.entities.Korisnik korisnik =new SQLite().select().from(mpet.project2018.air.database.entities.Korisnik.class).where(Korisnik_Table.id_korisnika.is(Integer.parseInt(id))).querySingle();
String korime = korisnik.getKorisnicko_ime();
Toast.makeText(getActivity(), korime, Toast.LENGTH_SHORT).show();
目前,我的代码位于onDataLoaded内,并且我得到NullPointer:java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法'java.lang.String mpet.project2018.air.database.entities.Korisnik.getKorisnicko_ime()'
public class Login extends Fragment implements onLoginValidation, KorisnikDataLoadedListener, KarticaDataLoadedListener, LjubimacDataLoadedListener, SkeniranjeDataLoadedListener {
private OnFragmentInteractionListener mListener;
public Login() {}
EditText edtUsername;
EditText edtPassword;
Button btnLogin;
Button btnPrijavaOdustani;
private SharedPreferences sharedPreferences;
private String globalId;
private ProgressDialog progress;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, final Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.activity_login, container, false);
if (mListener != null) {
mListener.onFragmentInteraction("Login");
}
checkConnection();
edtUsername = (EditText) view.findViewById(R.id.edtUsername);
edtPassword = (EditText) view.findViewById(R.id.edtPassword);
btnLogin = (Button) view.findViewById(R.id.btnLogin);
btnPrijavaOdustani = (Button) view.findViewById(R.id.btnPrijavaOdustani);
sharedPreferences = this.getActivity().getSharedPreferences("MyPref", 0); //u fragmentu dodaj this.getActivity..... jer nema CONTEXA
if (sharedPreferences.getString("ulogiraniKorisnikId", "").toString().equals("ulogiraniKorisnikId")) { //getString
FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();
ft.replace(R.id.mainFrame, new HomeLoggedIn());
ft.addToBackStack(null);
ft.commit();
}
btnLogin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String username = edtUsername.getText().toString();
String password = edtPassword.getText().toString();
//validate form
if (validateLogin(username, password)) {
//do login
doLogin(username, password);
showLoadingDialog();
}
}
});
btnPrijavaOdustani.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();
ft.replace(R.id.mainFrame, new HomeLoggedOut());
ft.addToBackStack(null);
ft.commit();
}
}
);
return view;
}
protected boolean isOnline() {
ConnectivityManager cm = (ConnectivityManager)getActivity().getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo netInfo = cm.getActiveNetworkInfo();
if (netInfo != null && netInfo.isConnectedOrConnecting()) {
return true;
} else {
return false;
}
}
public void checkConnection(){
if(!isOnline()){
Toast.makeText(getActivity(), "Nije uspostavljena internet veza", Toast.LENGTH_SHORT).show();
}
}
//LoadingDialog
public void showLoadingDialog() {
if (progress == null) {
progress = new ProgressDialog(getActivity());
progress.setMessage("Molimo pričekajte...");
progress.setCancelable(false);
progress.setButton("Odustani",(DialogInterface.OnClickListener)null);
}
progress.show();
}
public void dismissLoadingDialog() {
if (progress != null && progress.isShowing()) {
progress.dismiss();
}
}
/**/
private boolean validateLogin (String username, String password){
if (username == null || username.trim().length() == 0) {
Toast.makeText(getActivity(), "Potrebno je unijeti korisničko ime...", Toast.LENGTH_SHORT).show();
return false;
}
if (password == null || password.trim().length() == 0) {
Toast.makeText(getActivity(), "Potrebno je unijeti lozinku...", Toast.LENGTH_SHORT).show();
return false;
}
return true;
}
private void doLogin ( final String username, final String password){
String username1 = edtUsername.getText().toString();
String password1 = edtPassword.getText().toString();
PrijavaMethod postMetodaZaPrijavu = new PrijavaMethod(this);
String id = "";
String response = "";
postMetodaZaPrijavu.Upload(username1, password1);
}
@Override
public void onDataLoaded (String id){
globalId=id;
if (Integer.parseInt(id) != 0) {
getActivity().getSharedPreferences(SHARED_PREF_NAME,MODE_PRIVATE)
.edit()
.putString(Config.ID_SHARED_PREF,id)
.apply();
Toast.makeText(getActivity(), "Vas id je"+id, Toast.LENGTH_SHORT).show();
downloadDatabase(id);
/*zamjena izbornika*/
NavigationView navigationView = (NavigationView) getActivity().findViewById(R.id.nav_view);
navigationView.getMenu().clear();
navigationView.inflateMenu(R.menu.activity_main_drawer);
navigationView.getHeaderView(0);
navigationView.removeHeaderView(navigationView.getHeaderView(0));
navigationView.inflateHeaderView(R.layout.nav_header);
mpet.project2018.air.database.entities.Korisnik korisnik =new SQLite()
.select()
.from(mpet.project2018.air.database.entities.Korisnik.class)
.where(Korisnik_Table.id_korisnika.is(Integer.parseInt(id)))
.querySingle();
String korime = korisnik.getKorisnicko_ime();
Toast.makeText(getActivity(), korime, Toast.LENGTH_SHORT).show();
/**/
clearBackStack();
FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();
ft.replace(R.id.mainFrame, new HomeLoggedIn());
//ft.addToBackStack(null);
ft.commit();
dismissLoadingDialog();
} else {
Toast.makeText(getActivity(), "Korisnicko ime ili lozinka su netocni", Toast.LENGTH_SHORT).show();
dismissLoadingDialog();
}
}
private void clearBackStack() {
FragmentManager manager = getActivity().getSupportFragmentManager();
if (manager.getBackStackEntryCount() > 0) {
FragmentManager.BackStackEntry first = manager.getBackStackEntryAt(0);
manager.popBackStack(first.getId(), FragmentManager.POP_BACK_STACK_INCLUSIVE);
}
}
private void downloadDatabase(String id){
KorisnikDataLoader kor=new KorisnikDataLoader(this);
kor.loadUsersByUserId(id);
//nastavak skidanja baze u loaderima zbog zavisnosti
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
if (context instanceof OnFragmentInteractionListener) {
mListener = (OnFragmentInteractionListener) context;
} else {
throw new RuntimeException(context.toString() + " must implement OnFragmentInteractionListener");
}
}
@Override
public void onDetach() {
super.onDetach();
mListener = null;
}
@Override
public void KarticaOnDataLoaded(List<Kartica> listaKartica) {
LjubimacDataLoader ljub=new LjubimacDataLoader(this);
ljub.loadDataByUserId(globalId);
}
@Override
public void KorisnikOnDataLoaded(List<Korisnik> listaKorisnika) {
KarticaDataLoader kar=new KarticaDataLoader(this);
kar.loadDataByuserId(globalId);
}
@Override
public void LjubimacOnDataLoaded(List<Ljubimac> listaLjubimaca) {
SkeniranjeDataLoader sken=new SkeniranjeDataLoader(this);
sken.loadDataByUserId(globalId);
}
@Override
public void SkeniranjeOnDataLoaded(List<Skeniranje> listaSkeniranja) {
}
public interface OnFragmentInteractionListener {
void onFragmentInteraction(String title);
}
private class ArticleFragment {
}
在MainActivity中创建公共 void changePicture()方法,并通过该方法执行将图像和文本设置为navHeader的操作。
之后,从片段执行以下操作以运行MainActivity的方法:
((MainActivity)context).changePicture();
哪里
context = getContext();
根据需要在函数中传递所需的参数,例如imageUri / imageBitmap / textViews / imageViews。
注意:方法应该是公共的,以便您可以从片段中调用它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.