簡體   English   中英

在使用Intent導航后重新加載MainActivity

[英]Reload MainActivity after navigating with Intent

我需要幫助讓我的MainActivity重新加載以反映用戶登錄的時間。

我的MainActivity是這樣的:

        NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
        navigationView.setNavigationItemSelectedListener(this);
        if (session.getPerms().equals("mod") || session.getPerms().equals("dev") || session.getPerms().equals("admin")){
            Menu nav_Menu = navigationView.getMenu();
            nav_Menu.findItem(R.id.nav_queue).setVisible(true);
        }else{
            Menu nav_Menu = navigationView.getMenu();
            nav_Menu.findItem(R.id.nav_queue).setVisible(false);
        }

        if(session.getLogInState()){
            Menu nav_Menu = navigationView.getMenu();
            nav_Menu.findItem(R.id.nav_login).setVisible(false);
        }
    }
    @Override
    public boolean onNavigationItemSelected(MenuItem item) {
        // Handle navigation view item clicks here.
        int id = item.getItemId();

        if (id == R.id.nav_login) {
            Intent login = new Intent(MainActivity.this, Login.class);
            finish();
            startActivity(login);

        } else if (id == R.id.nav_queue) {
            startActivity(new Intent(MainActivity.this, ModQueue.class));

        } else if (id == R.id.nav_share) {

        } else if (id == R.id.nav_send) {

        }
}

我的登錄活動(或更准確的部分):

if (conPassword.equals(secPassword)) {
                session.setLogInState(true);
                session.setEmail(conEmail); ;
                session.setPerms(perms);
                session.setFirst(first);
                session.setLast(last);
                rs.close(); //if a ResultSet was returned
                stmt.close(); //Close Statement
                con.close();
                System.out.println("Logged in");
                System.out.println(session.getPerms());
                Intent main = new Intent(Login.this, MainActivity.class);
                finish();
                startActivity(main);
            } else {
                System.out.println("Unable to Login");
            }

所以問題是當我回到我的MainActivity時它沒有更新,因此它沒有看到它現在已經登錄。

我需要我的MainActivity來顯示我已登錄,以便它將根據權限顯示相應的選項,並隱藏登錄選項,因為它已經登錄。

編輯:這是我的會話管理類

    public class SessionManagement {
    private boolean LoggedIn = false;
    private String perms = "Guest";
    private String email;
    private String first;
    private String last;


    public boolean getLogInState(){ return LoggedIn; }

    public void setLogInState(Boolean Logged){ LoggedIn = Logged; }

    public String getPerms(){ return perms; }

    public void setPerms(String newPerms){ perms = newPerms; }

    public String getEmail(){ return email;}

    public void setEmail(String newEmail){ email = newEmail; }

    public String getFirst(){ return first;}

    public void setFirst(String newFirst){ first = newFirst; }

    public String getLast (){ return last;}

    public void setLast (String newLast){ last = newLast;}

}

因此,您必須創建一個Singleton類或將Session類創建為Parcelable,以便能夠在一個包中傳遞它。

獨生子

您只需將會話保留在內存中即可。 清除應用程序后,會話也將從內存中清除。

會議

public class Session {
    public boolean isLoggedIn;
}

SessionInjector

public class SessionInjector {

private static Session session;

public static Session getSession() {
    if (session == null) {
        session = new Session();
    }
    return session;
}
}

第一種方法

主要活動

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    if (!SessionInjector.getSession().isLoggedIn) {
        startActivity(new Intent(this, LoginActivity.class));
        finish();
    } else {
        ((TextView) findViewById(R.id.text)).setText("Logged In!");
    }
}

}

LoginActivity

public class LoginActivity extends AppCompatActivity {

@Override

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main2);

    SessionInjector.getSession().isLoggedIn = true;

    startActivity(new Intent(this, MainActivity.class));
    finish();
}

}

第二種方法

開始結果活動。 這是這種場合的完美示例,而不是完成活動,然后重新啟動相同的活動。 您只需要對所做的更改做出反應。

主要活動

public class MainActivity extends AppCompatActivity {

private final static int LOGIN_REQUEST_CODE = 44;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    if (!SessionInjector.getSession().isLoggedIn) {
        startActivityForResult(new Intent(this, LoginActivity.class), LOGIN_REQUEST_CODE);
    }
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == LOGIN_REQUEST_CODE) {
        if (resultCode == RESULT_OK) {
            ((TextView) findViewById(R.id.text)).setText("Logged In!");
        }
    }
}

}

LoginActivity

public class LoginActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main2);

    SessionInjector.getSession().isLoggedIn = true;

    setResult(RESULT_OK);
    finish();
}

}

當Activity完成后, session作為引用被銷毀,因此該對象中的所有數據都將丟失,新活動將創建一個空的新session (默認值)

您需要做的是使用單例或在SessionManagement使用public static變量並直接訪問它們。

public class SessionManagement {
    public static boolean LoggedIn = false;
    public static String perms = "Guest";
    public static String email;
    public static String first;
    public static String last; ...

並在您的登錄活動中:

if (conPassword.equals(secPassword)) {
   SessionManagement.LoggedIn = true;
   SessionManagement.perms =perms; ....

同樣在MainActivity中直接訪問變量來檢查它們,

if (SessionManagement.perms.equals("mod") ...

如果你想保持你的變量私有你仍然可以使用private static變量和public static的setter / getters這樣它也可以工作,你會保持你的變量私有

你可以像這樣使用:

SessionManagement.setPerms(...);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM