2011-10-11 2 views
3

나는 몇 가지 안드로이드 개발을 시작했고, 내가 작업하고있는 앱의 첫 번째 화면에서 로그인 여부에 따라 화면에 로그인/등록 프롬프트 또는 사용자의 사진을 표시하고 싶습니다. 앱에.Android에서 레이아웃 xml을 조건부로 사용 하시겠습니까?

xml을 사용하여이 스크래치를해야하나요? 또는 사용자가 로그인했는지 여부에 따라 XML을 다르게 가져올 수있는 방법이 있습니까?

답변

3

실제로 레이아웃을 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 tutorials을 사용해보세요. 당신은 좀 더 깊이를 원하는 경우 또는,이 가

이 * 편집 죄송합니다, 자동 주요 활동에 사용자를 전달 별도의 로그인 활동을 만들 super.onCreate()

sgarman의 제안에 전화하는 것을 잊었다는 Dev guide

시도 또한 매우 실용적이며, 그는 그 접근법의 모듈성에 관해 좋은 지적을합니다.

사용자가 이미 로그인 한 경우 해당 활동을 마무리하고 (startActivity()) 레이아웃으로 로그인 한 활동으로 경로를 지정할 수 있습니다.

IMO는 대부분 개인적인 취향입니다.

0

두 가지 선택 사항이 있습니다. 1) 두 개의 별도 화면을 만들고 적절한 화면을 보여줍니다. 2) XML에서 FrameLayout을 사용하고 서로 다른 두 세트의 뷰를 겹쳐서 오버레이합니다. 그런 다음 코드에서 보지 않으려는 물건에 대한 가시성을 설정하십시오.

1

이 문제를 처리 할 수있는 방법이 몇 가지 있습니다.

사용자가 이미 로그인 한 경우 해당 활동을 마무리하고 (startActivity()) 레이아웃으로 로그인 한 활동으로 경로를 지정할 수 있습니다. 로그인 만위한 활동이있을 수 있습니다.

RelativeLayouts를 사용하고 사용자 정보 섹션을 visibility : gone로 설정하여 필요한 모든 레이아웃 부분을 서로 위에 포함 할 수 있습니다. 사용자가 로그인 한 경우, ViewById()를 찾아서 ViewVISIBLE에 대한 VISIBITity를 설정할 수 있습니다.

setContentView를 호출하기 전에 사용자가 로그인했는지 여부를 확인하고이를 기반으로 올바른 레이아웃을 선택할 수 있습니다.

첫 번째 선택은 아마도 가장 모듈 식이지만 가장 무거운 것입니다. 내 코드에서는 성공적인 로그인 등을 기반으로 다른 활동에 결과를 반환하는 활동으로 로그인합니다. 논리가 완전히 분리 된이 방식으로 로그인 문제를 처리하기 위해 앱의 어느 곳에서나 한 번의 호출 만 할 수 있습니다.

0

onCreate에서 setContentView 메서드를 사용할 수 있습니다. 기록 된 사용자를 확인하기위한 멤버 변수를 정의하십시오. 그리고 각 경우에 따라 setContentView 메소드를 사용하여 XML 레이아웃을 선택하십시오.

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

저는 현재 개발중인 앱에서 동일한 별자리가 있습니다.

먼저 FragmantActivity 또는 AppCompatActivity를 확장하는 시작 활동이 필요합니다. 이 활동을 MainActivity라고 부르 자. 로그인/등록 레이아웃을위한 다른 조각을 만드십시오. 그리고 시작 활동 인 MainActivity에서 로그인 단편을 표시할지 여부를 onResume() -MODOD에서 처리 할 수 ​​있습니다.

@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

예는 인증을위한 서비스 클래스의 오브젝트이다. 사용자가 로그인했는지 여부를 나타내는 부울 표시를 반환하는 메서드가 있습니다. 사용자가 로그인하면 현재 조각이 로그인 조각으로 바뀝니다. 그게 전부입니다.

조각을 사용하면 레이아웃을 다른 로직과 함께 조건부로 표시 할 수 있습니다. 조각의 인스턴스의

설명 : 생성자가 오버로드되지해야하기 때문에

프로젝트에 조각을 추가 할 경우, 안드로이드 스튜디오는 정적 팩토리 메소드 위해서, newInstance() 일부 상용구 코드를 생성합니다. 로그인 단편 작성에 인수를 전달할 필요가없는 경우, 새 LoginFragment()를 사용하여이를 수행 할 수 있습니다. 그러나 인수가 필요한 경우 인수없이 단편을 인스턴스화하는 newInstance 팩터 리 메서드를 사용해야합니다. 여기에 대한 좋은 설명이 있습니다. https://stackoverflow.com/a/9245510/474985

관련 문제