2011-06-10 6 views
4

보기에 onDraw() 함수를 사용하여 그릴 사용자 정의보기가 있습니다. 또한 그래픽을 그리기 위해 ACtivity의 일부 데이터가 필요합니다. 그래서 그 대신 표준 setContentView(R.layout.myview)를 사용하는 나는 다음과 같은 사용하고 - 인플레이션보기 및 사용자 정의보기

MyView mv = new MyView(this, userData); 
setContentView(mv); 

내가있는 CustomView 위의 textview을 추가 할 때까지 작동하는 것 같았다. 그런 다음 위의 코드가 텍스트 뷰를 전혀 표시하지 않는다는 것을 알았습니다. 또한 onFinishInflate()은 호출되지 않습니다. 이 경우 레이아웃을 직접 팽창해야합니까? 그렇다면 onDraw() 기능을 직접 호출해야합니까?

감사합니다, - XML에서보기 을 팽창 P

답변

4

당신이 여기가해야 할 것은이 포함 된 레이아웃입니다 TextViewMyView을 선택한 다음 활동 내에서 사용자 정의보기를 찾아 사용자 데이터를 전달하십시오. 그런 다음 MyViewonDraw() 중에 이것을 사용할 수 있습니다. 이 같은 아마 뭔가 :

res/layout/main.xml :

<LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="veritcal"> 
    <TextView 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:text="Hello World" /> 
    <my.package.MyView 
     android:id="@+id/myview" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" /> 
</LinearLayout> 

src/my/package/MyView.java :

public class MyView extends View { 
    UserData mUserData = null; 
    public void setUserData(userData) { 
     mUserData = userData; 
    } 

    @Override 
    protected void onDraw(Canvas canvas) { 
     performCustomDrawingWithUserData(mUserData); 
     super.onDraw(canvas); 
    } 

} 

src/my/package/MyActivity.java :

public class MyActivity extends Activity { 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     // pass the user data into myview here. 
     MyView myView = (MyView) findViewById(R.id.myview); 
     myView.setUserData(userData); 
    } 

} 
6

onFinishInflate()

의 Finalize. 보기가 추가 된 후이를 마지막으로 인플레이션 단계라고합니다. 당신이 코드에 의해보기를 만들 때

(new ...) 당신은 당신이 그것을 팽창하는 당신은 XML로 선언하거나 getLayoutInflater().inflate(R.layout.your_view,null,null); 같은 것을 사용하는 경우, 다른 한편으로는 ... 그것을 팽창 (및 onFinishInflate되지 않습니다)가 호출됩니다.

어떻게 하시겠습니까? onDraw 메서드는 항상 호출됩니다. 따라서 수동으로 호출 할 필요가 없습니다.

그런데 ... 데이터가 필요한 경우에도 사용자 설정보기를 XML에 유지하는 것이 좋습니다. 그래서 당신은 적어도 두 가지 옵션 :

setContentView(R.layout.your_layout); 
YourCustom custom = (YourCustom)findViewById(R.id.custom); 
custom.setUserData(userData); 

또는 ... 사용자 정의보기 (권장하지 않음)에서 데이터를 가져올 수는 :

// inside your custom view... 
UserData userData = Someclass.getUserData(getContext()); 
// etc... so that you don't have to pass it from the activity 
관련 문제