Использовать Layout xml условно в Android? - PullRequest
3 голосов
/ 11 октября 2011

Я начинаю с разработки для Android, и на первом экране приложения, над которым я работаю, я хочу, чтобы на экране отображалось либо приглашение к входу / регистрации, либо фотография пользователя, в зависимости от того, являются ли онивошли в приложение.

Должен ли я просто поцарапать, используя xml для этого?или есть способ, которым я могу заставить xml рисовать по-разному в зависимости от того, вошел ли пользователь в систему?

Ответы [ 5 ]

3 голосов
/ 11 октября 2011

На самом деле это хорошая идея, чтобы сохранить ваши макеты в XML.Просто создайте два файла макета (по одному для каждого экрана) и программно выберите один или другой в зависимости от состояния входа в систему.

public class MyActivity extends Activity{

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate();
        /* Check login status */
        if (loggedIn == true){
            this.setContentView(R.layout.logged_in);
        }            

        else if (loggedIn == false){
            this.setContentView(R.layout.not_logged_in);
        }
    }
}

Возможно, вы захотите попробовать руководства для Android , чтобы начать.Или, если вы хотите больше глубины, попробуйте Руководство разработчика

* Редактировать упс, забыл вызвать super.onCreate ()

предложение sgarman для создания отдельного входа в системуэто автоматически перенаправляет пользователя к вашему основному виду деятельности, также весьма жизнеспособно, и он делает хорошую замечание относительно модульности этого подхода.

Вы могли бы выполнять действие только для входа в систему, если пользовательуже выполнив вход, вы можете завершить () это действие и направить их (startActivity ()) к зарегистрированному действию со своим макетом.

IMO, в основном это личные предпочтения.

1 голос
/ 11 октября 2011

Есть несколько способов справиться с этим.

Вы можете выполнить действие только для входа в систему, если пользователь уже вошел в систему, вы можете завершить () это действие и направить его (startActivity ())для входа в систему с вашим макетом.

Вы можете включить все части макета, которые вам нужны, друг над другом, используя RelativeLayouts и установив видимость раздела информации о пользователе: нет.Если пользователь вошел в систему, вы можете найти ViewById () и установить дляVisibitlity значение View.VISIBLE.

Вы можете проверить, вошел ли пользователь в систему ПЕРЕД вызовом setContentView, и выбрать правильный макет на основе этого.

Первый выбор, вероятно, самый модульный, но и самый тяжелый.В моем коде есть вход в систему, который возвращает результаты другим действиям, основанным на успешном входе в систему и т. Д. Таким образом, логика полностью отделена, и я могу просто сделать один вызов из любого места в приложении для решения проблем входа.

0 голосов
/ 28 ноября 2017

У меня есть такое же созвездие в приложении, которое я сейчас разрабатываю.

Прежде всего, вам нужен запуск Activity, расширяющий FragmantActivity или AppCompatActivity.Давайте назовем эту деятельность MainActivity.Просто создайте еще один фрагмент для входа / регистрации со своим макетом.А в MainActivity, который является активностью запуска, вы можете обрабатывать в onResume() -Методе, отображать ли фрагмент логина или нет.

Пример

@Override
    protected void onResume() {
        super.onResume();
        Log.d(TAG, "onResume");
        if (!userManager.isLoggedIn()) {
            LoginFragment loginFragment = LoginFragment.newInstance();
            //LoginFragment loginFragment = new LoginFragment();
            getSupportFragmentManager().beginTransaction()
                    .replace(R.id.fragment_layout, loginFragment,
                            LoginFragment.class.getSimpleName()
                    ).commit();
        }
    }

userManager - это объект класса обслуживания для аутентификации.У него есть метод, возвращающий логическое указание, вошел ли пользователь в систему или нет.Если пользователь вошел в систему, текущий фрагмент заменяется фрагментом входа в систему.Вот и все.

С фрагментами вы можете условно отображать различные макеты со своей собственной логикой.

Объяснение создания фрагмента:

Если вы добавляете фрагмент в свой проект, AndroidStudio создает шаблонный код с помощью статического метода фабрики newInstance (), поскольку конструктор не должен быть перегружен.Если вам не нужно передавать аргументы для создания фрагмента входа в систему, вы можете сделать это с помощью нового LoginFragment ().Но если вам нужны аргументы, вы должны использовать фабричный метод newInstance, который создает экземпляр фрагмента без каких-либо аргументов.Вот хорошее объяснение этому: https://stackoverflow.com/a/9245510/474985

0 голосов
/ 11 октября 2011

Вы можете использовать метод setContentView в onCreate. Определите переменную-член, чтобы проверить, зарегистрирован ли пользователь. И выбирайте макеты XML, используя методы setContentView для каждого случая.

public class Login_testActivity extends Activity {

//If logged, set user id.
private String loginId = null;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if(loginId==null || loginId.equals(""))
    {
        //Not Logged. show login form.
        setContentView(R.layout.login);
    }
    else
    {
        //Logged. show user's photo.
        setContentView(R.layout.main);
    }
}
0 голосов
/ 11 октября 2011

У вас есть два варианта.1) Сделайте два отдельных экрана и покажите соответствующий.2) Используйте FrameLayout в своем XML и наложите два разных набора представлений друг на друга.Затем в коде установите видимость того, что вы не хотите видеть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...