繁体   English   中英

如何使用片段中的数据更改导航标题中的用户名?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM