java - 如何使用片段中的数据更改导航标题中的用户名?
问题描述
当用户登录应用程序时,我正在尝试更改导航标题。当用户登录时,用户名和图片应该改变。我正在尝试使用共享首选项中的 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: Attempt to invoke virtual method 'java.lang.String mpet.project2018.air.database.entities.Korisnik.getKorisnicko_ime()' on an null object reference
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 中创建public void changePicture() 方法,并在该方法中将图像和文本设置到 navHeader 中。
之后从片段执行以下操作以运行 MainActivity 的该方法:
((MainActivity)context).changePicture();
在哪里
context = getContext();
根据您的要求,在您需要的函数中传递所需的参数,例如 imageUri / imageBitmap / textViews / imageViews。
注意:方法应该是公开的,以便您可以从片段中调用它。
推荐阅读
- javascript - 如何使用 JS 的“加载更多”按钮从网站上抓取数据
- google-sheets-api - Google Sheet SheetID 问题
- ios - firebase_database - 创建 iOS 版本时未找到模块“firebase_database”。(扑)
- django - 如何使用 Q 使用字符串进行过滤
- pandas - 在使用 to_gbq 或 to_sql 将其推送到 Google BigQuery 之前,如何为 Pandas DataFrame 创建唯一 ID?
- c# - 如何将网站图标和网站名称添加到 EasyTabs
- python - 如何将csv导入jupyter笔记本?
- python - 如何在 Python 中绘制 3D 向量
- c# - C#将文本添加到ListBox,并在“foreach”循环中为来自Json的每个文本设置唯一值
- jquery - 无法在分页jquery数据表中的ajax调用中发送每页的页码和页行数据