2011-05-06 4 views
7

ArrayAdapterTextView의 글꼴을 변경하려고합니다. chantelli_antiqua.ttf 글꼴은 assets 폴더에 있습니다. 을 listitem 레이아웃ArrayAdapter의 textview에 대한 사용자 정의 글꼴

listItemAdapter = new ArrayAdapter<MenuItem>(this, R.layout.listitem, menuItems); 

Typeface font = Typeface.createFromAsset(getAssets(), "chantelli_antiqua.ttf"); 
TextView v = (TextView)listItemAdapter.getView(0, null, null); 
v.setTypeface(font); 

XML : 나는 문제가 Adapter.getView(int, View, ViewGroup) 방법으로 거짓말을 매우 확신

<?xml version="1.0" encoding="utf-8"?> 
<TextView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:padding="10dp" 
    android:textSize="30sp" 
/> 

여기 내 자바 코드입니다. 변수로 전달할 내용을 실제로 이해하지 못했으며 null을 시도했습니다. 그러나 이것은 내가 원했던 것을하지 않습니다.

Adapter에있는 TextView의 글꼴을 사용자 지정 글꼴로 변경하는 방법은 무엇입니까?

업데이트

는 픽시의 제안에 따르면 나는 ArrayAdapter<MenuItem> 확장하는 MenuItemAdapter 생성 :

public class MenuItemAdapter extends ArrayAdapter<MenuItem> 
{ 
    private Typeface font; 

    public MenuItemAdapter(Context context, int textViewResourceId, List<MenuItem> objects) 
    { 
     super(context, textViewResourceId, objects); 

     font = Typeface.createFromAsset(context.getAssets(), "chantelli_antiqua.ttf"); 
    } 

    @Override 
    public View getView(int position, View view, ViewGroup viewGroup) 
    { 
     ((TextView)view).setTypeface(font); 
     return super.getView(position, view, viewGroup); 
    } 
} 

을 그리고 내 자바 코드를 변경 :

listItemAdapter = new MenuItemAdapter(this, R.layout.listitem, menuItems); 

하지만 지금 내 응용 프로그램 충돌 후 onCreate ListActivity 중 하나이지만, 중단 점이 getView(...)에 도달하기 전에는 왜 그런지 알아낼 수있었습니다. 어떠한 제안?

갱신 2

가의 getView (...)의 코드를 변경 :

@Override 
public View getView(int position, View view, ViewGroup viewGroup) 
{ 
View v = super.getView(position, view, viewGroup); 
((TextView)v).setTypeface(font); 
return v; 
} 

이 작동합니다. :)

+0

[레이아웃을 사용하여 맞춤 글꼴 적용] (http://androidtrainningcenter.blogspot.in/2013/07/applying-custom-font-in-entire-android.html) – Sameer

답변

2

어댑터의 getView() 메서드를 호출하면 안됩니다. ListView이 처리합니다. ArrayAdapter 클래스를 확장하고 getView() 메서드를 대신 오버라이드해야합니다. 이 방법에서는 새로운보기를 부 풀거나 convertView을 다시 사용하고이보기의 서체를 설정해야합니다.

+0

이것은 유망한 대답처럼 들릴 수 있지만 저를 아직 완전히 데려가십시오. 내 업데이트 된 질문을 참조하십시오. 미리 감사드립니다. – Bazzz

+0

제안을 받아 주셔서 감사합니다. – Bazzz

2

나는 문제가 return super.getView(position, view, viewGroup);의 getView() 메소드 끝에 있다고 생각한다. 는 나는이 코드는 지금 그것을 시도하지 않았지만 내가 전에 사용자 정의 ArrayAdapter와를 만들어가 그런 일이었다 예입니다 유의하시기 바랍니다이

@Override 
public View getView(int position, View view, ViewGroup viewGroup) 
{ 
    TextView tv = ((TextView)view).setTypeface(font); 
    tv.setText(<String> getItem()); 
    return tv; 
} 

같이 있어야한다고 생각합니다.
다음은 사용자 정의 arrayAdapter를 작성하는 방법을 설명하는 tutorial입니다.

+0

+1 사실, 해결책입니다. 나는 그것을 알아낼 수 있었다. 불행하게도 나는 당신의 대답을 전에 읽지 않았다. 어쨌든 고마워. – Bazzz

+0

그래도 super에 대한 호출이 필요하다는 것을 알았지 만, 그렇지 않은 경우 View는 null입니다. – Bazzz

+1

예 (view == null) getView 메서드의 시작 부분에 있는지 확인하고 참인 경우 findViewById()를 호출하여 뷰를 가져온 다음 정상적으로 계속 수행해야합니다. – Amal

관련 문제