2016-09-15 3 views
0

레이아웃 XML 파일을 Java 코드로 해석하여 이런 방식으로 뷰 계층 구조를 작성했습니다.XML을 사용하지 않고 레이아웃 만들기

먼저 어떻게하고 어디에서 완료할까요? 누군가가 나를이 해석을하는 곳으로 연결시킬 수 있습니까?

둘째, XML 파일을 사용하지 않고 전체 레이아웃을 만들 수 있습니까? 대답이 '예'라면 어떤 방식 으로든 유용합니까? (XML 파일에 비해 장점이 있습니까?) 큰 응용 프로그램에서이 작업을 수행합니까?

+0

자바 만 사용하여 그래픽을 만들 수 있습니다. –

+0

예, 가능합니다. – user8

답변

2

이 레이아웃 XML 파일은 Java 코드로 해석되어 이런 방식으로 뷰 계층 구조를 작성했습니다.

"Java 코드로 해석 됨"구문의 대부분의 정의가 아닙니다. XML은 구문 분석되어 XML에 표시된 뷰에 해당하는 Java 객체를 만드는 데 사용됩니다.

누군가 나를이 해석을하는 곳으로 연결시킬 수 있습니까? 아마도

You are looking for LayoutInflater 일 것입니다.

XML 파일을 사용하지 않고 전체 레이아웃을 만들 수 있습니까?

확실히.

어떤 방식 으로든 유용할까요?

간결한 UI (예 : 전체 콘텐츠보기는 WebView)의 경우 약간 더 간단하고 작은 비트는 빠릅니다.

많은 게임이 Java 기반 UI를 완전히 건너 뛰고 OpenGL을 사용하여 C/C++에서 출력을 렌더링합니다. 비슷하게 하이브리드 앱 프레임 워크 (예 : PhoneGap)는 웹 기술 (HTML, CSS, JS 등)을 통해 UI를 렌더링 할 때 대부분의 Java 기반 UI 작업을 건너 뜁니다.

+0

Java를 전혀 사용하지 않는 Android 앱이 있다는 것을 의미합니까? Android NDK를 언급하고 있습니까? – Pilpel

+0

@ 필펠 : "Java를 전혀 사용하지 않는 안드로이드 앱이 있다는 것을 의미합니까?" - 그들은 아무 것도 쓰지 않습니다. 프레임 워크가 제공하는 일부 심 (예 :'NativeActivity')이 있습니다. "당신은 안드로이드 NDK를 언급하고 있습니까?" - C/C++ 시나리오에서 그렇습니다. – CommonsWare

1
  • XML 파일을 사용하지 않고 완전한 레이아웃을 만들 수 있습니까?

물론 가능합니다. 그러나 그것은 유용합니까? 프로그래밍 방식으로 요소를 추가하려는 경우 일 수 있습니다. 전체 UI의 경우 XML 작성의 잠재력으로 인해 유용하지 않다고 생각합니다.

예 : Adding LinearLayout programmatically in Android doesn't work

LinearLayout LL = new LinearLayout(this); 
LL.setBackgroundColor(Color.CYAN); 
LL.setOrientation(LinearLayout.VERTICAL); 

LayoutParams LLParams = new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT); 

LL.setWeightSum(6f); 
LL.setLayoutParams(LLParams); 


ImageView ladder = new ImageView(this); 
ladder.setImageResource(R.drawable.ic_launcher); 

FrameLayout.LayoutParams ladderParams = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.WRAP_CONTENT, FrameLayout.LayoutParams.WRAP_CONTENT, Gravity.BOTTOM); 
ladder.setLayoutParams(ladderParams); 

FrameLayout ladderFL = new FrameLayout(this); 
LinearLayout.LayoutParams ladderFLParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, 0); 
ladderFLParams.weight = 5f; 
ladderFL.setLayoutParams(ladderFLParams);  
ladderFL.setBackgroundColor(Color.GREEN); 
View dummyView = new View(this); 

LinearLayout.LayoutParams dummyParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,0); 
dummyParams.weight = 1f; 
dummyView.setLayoutParams(dummyParams); 
dummyView.setBackgroundColor(Color.RED); 



ladderFL.addView(ladder); 
LL.addView(ladderFL); 
LL.addView(dummyView); 
RelativeLayout rl=((RelativeLayout) findViewById(R.id.screenRL)); 
rl.addView(LL); 
  • 큰 앱이해야합니까?

일반적인 자지랑이 응용 프로그램에서는 사용하지 않습니다. 그러나 UI를 프로그램 적으로 관리하는 데 유용한 몇 가지 특별한 경우가 있습니다.

0

Android XML 파일은 레이아웃 생성을 간소화하기 위해 만들어졌습니다. 이러한 파일은 Java 코드에서 해석되어 오브젝트로 변환됩니다. 자신 만의 클래스를 만들 수 있습니다 (View, ViewGroups로부터 상속 받음).) 사용자 정의 속성을 사용하여 XML 레이아웃을 확장합니다.

때때로 Java 코드에서보기를 생성하는 것이 좋습니다. 예를 들어 응용 프로그램이 데이터 모델에 따라 동적 레이아웃을 렌더링해야하는 경우가 있습니다. 하지만 자바를 사용하여 모든 레이아웃을 만드는 것은 좋은 생각이 아닙니다. (그렇습니다. 언제나 가능합니다). 내가 볼 수있는 유일한 단점은 XML을 구문 분석 할 필요가 없지만 레이아웃 코드 구성을 존중한다는 것입니다.

0

첫 번째 질문 : 당신이 XML에있는

레이아웃, 자바 객체의 모음 예 : LinearLayout이 메소드가 자바의 클래스에 해결합니다. findViewById을 호출 할 때 해당 객체에 대한 참조를 얻으므로 해당 뷰 객체에 대해 다른 메소드를 호출 할 수 있습니다. 특정보기의 작동 방식에 대해 궁금한 경우 CMD + Click을 클래스 이름으로 사용하고 Android Studio에서 디 컴파일 된 소스를 가져올 수 있습니다 (키는 Windows와 다를 수 있음).

XML에서 수행 할 작업을 알고있는 방식에 대해서는 android: 관련 태그가 모두 해당보기의 클래스에서 AttributeSet으로 검색됩니다. 여기에서 텍스트 크기 설정 또는 클래스에 하위 뷰 추가와 같은 관련 작업을 수행하기 위해 메소드가 호출됩니다.

두 번째 질문 :

예는 XML없이 레이아웃을 만들 수 있습니다. LinearLayout에서 새 클래스로 확장 한 다음 ActivityonCreate에서 레이아웃 참조 대신 해당보기를 setContentView으로 전달할 수 있습니다.

이 정보가 유용할까요? 대부분의 경우 XML을 사용하여보기를 작성하는 것이 읽기 쉽고 이해하기 쉽습니다 (예 : 그래픽 미리보기). 그러나 사용자 정의보기를 작성해야하는 경우 가장 확실하게 수행 할 수 있으며 기능을 확장하는 데는 많은 이유가 있습니다 (예 : Button 또는 LinearLayout의 기능 확장).

보기에 대한 자세한 내용은 Google's official documentation에서 확인할 수 있습니다.

1

기본 코드는 내 블로그에서했던 어떤이 같이 될 것입니다 :

public class MainActivity extends Activity { 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     // creating LinearLayout 
     LinearLayout linLayout = new LinearLayout(this); 
     // specifying vertical orientation 
     linLayout.setOrientation(LinearLayout.VERTICAL); 
     // creating LayoutParams 
     LayoutParams linLayoutParam = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); 
     // set LinearLayout as a root element of the screen 
     setContentView(linLayout, linLayoutParam); 

     LayoutParams lpView = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); 

     TextView tv = new TextView(this); 
     tv.setText("TextView"); 
     tv.setLayoutParams(lpView); 
     linLayout.addView(tv); 

     Button btn = new Button(this); 
     btn.setText("Button"); 
     linLayout.addView(btn, lpView); 


     LinearLayout.LayoutParams leftMarginParams = new LinearLayout.LayoutParams(
       LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); 
     leftMarginParams.leftMargin = 50; 

     Button btn1 = new Button(this); 
     btn1.setText("Button1"); 
     linLayout.addView(btn1, leftMarginParams); 


     LinearLayout.LayoutParams rightGravityParams = new LinearLayout.LayoutParams(
       LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); 
     rightGravityParams.gravity = Gravity.RIGHT; 

     Button btn2 = new Button(this); 
     btn2.setText("Button2"); 
     linLayout.addView(btn2, rightGravityParams); 
    } 
} 

Dummy

0

XML 파일 예, View 객체로 팽창하고 있습니다.

"어떻게 완료합니까?"- 코드의 위치에 따라 다릅니다. 액티비티에서

- 당신이 조각에서 setContentView(View v) 또는 setContentView(int layoutRes)

를 볼 수 있습니다 - 당신이 onCreateViewView 객체를 반환 것을 볼 수 있습니다. 일반적으로 a에서 가져온 것 LayoutInflater

XML 파일을 사용하지 않고 완전한 레이아웃을 만들 수 있습니까?

확실히. 경우에 따라 자신 만의 XML 파일을 작성할 필요가 없습니다. android.R.layout.*의 사전 정의 된 파일이 있습니다.예를 들어, ListView 및 어댑터.

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(android.R.layout.list_content); // Pre-defined ListView 
    mListView = (ListView) findViewById(android.R.id.list); // Existing List ID 
    mAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1); // Item Layout 
    mListView.setAdapter(mAdapter); 

하지만 당신은 문자 그대로 모든 XML 파일을 사용하지 않을 것이라면, 당신은 같은 것을 사용할 수 있습니다 - 끝 부분에 다음 setContentView을 사용자 스스로 View을 bulid. 등록을 마친 경우

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    LinearLayout ll = new LinearLayout(this); 

    LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
      ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); 
    ll.setLayoutParams(lp); 

    EditText editText = new EditText(this); 

    Button b = new Button(this); 
    b.setText("Click Me!"); 
    b.setOnClickListener(null); 

    ll.addView(editText, 
      new ViewGroup.LayoutParams(
        ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)); 

    ll.addView(b, 
      new ViewGroup.LayoutParams(
        ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)); 

    setContentView(ll); 
} 

은 어떤 방식으로 유용하다? (XML 파일에 비해 장점이 있습니까?) 큰 응용 프로그램에서이 작업을 수행합니까?

나는 그것이 유용 할 이유를 생각할 수 없다. 물론 동적 뷰를보다 잘 제어 할 수 있지만 레이아웃 편집기를 사용하여 쉽게 시각화 할 수는 없습니다.

큰 응용 프로그램에서이 작업을 수행하는 경우가 있지만 사용자 정의보기를 많이 재사용해야하는 큰 응용 프로그램을 만들 계획이 있습니까?

관련 문제