java - 使用 Intent 导航后重新加载 MainActivity

标签 java android android-intent

我需要帮助让我的 MainActivity 重新加载以反射(reflect)用户登录的时间。

我的 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) {

        }
}

我的登录 Activity (或更准确的重要部分):

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 来显示我已登录,这样它将根据权限显示适当的选项,并隐藏登录选项,因为它已经登录。

编辑: 这是我的 session 管理类

    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 才能将其打包传递。

单例

您只需将 session 保存在内存中即可。清除应用程序时, session 也会从内存中清除。

session

public class Session {
    public boolean isLoggedIn;
}

session 注入(inject)器

public class SessionInjector {

private static Session session;

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

第一种方法

主 Activity

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!");
    }
}

}

登录 Activity

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();
}

}

第二种方法

为结果开始 Activity 。这是此类场合的完美示例,而不是完成 Activity 然后重新开始同一个 Activity 。您只需要对所做的更改使用react。

主 Activity

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!");
        }
    }
}

}

登录 Activity

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();
}

}

关于java - 使用 Intent 导航后重新加载 MainActivity,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45583362/

相关文章:

android - 如何限制 Android 谷歌自动完成 API 只获取火车站

java - 如何在android中动态设置布局

java - 我真的不明白我的讲师在这里说的是什么——关于用 Java 计算素数的讲义

java - java : how reduce repeated code 异常

java - 无法在主要 Activity 上显示操作栏

java - 什么时候在android项目中回收位图?

java - 你会在这个程序中改变什么? ( java )

android - 应用程序何时收到 INSTALL_REFERRER 广播?

Android - 从另一个 Activity 控制按钮

java - 找不到处理默认 Activity Intent 的 Activity