我有一个活动获取一些片段并将它们放入列表中。 其中一个片段有一个TextView,我想改变它的字体。
从片段类中我不能这样做,因为它不是一个活动,并且与TextViews交互是不可用的。
在包含片段列表的活动中,我不知道如何访问该textview,因此我可以使用它。
这里有一些代码:
public class MyProfileFriendsFriendFragmentList extends SherlockListFragment {
private TextView tvMyFriendsListFriendName;
private Typeface font1;
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
String[] values = new String[] { "Daddy Yankee", "Michael Schumacher", "Krista Rock", "Ben Jordan", "Bruce Springsteen", "Jane Carol", "Susan Jackson", "Marshall Mathers", "Cauth Bodva", "Ringo Starr" };
ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(), R.layout.my_profile_friend_fragment, R.id.tvMyFriendsListFriendName, values);
setListAdapter(adapter);
tvMyFriendsListFriendName = (TextView) getView().findViewById(R.id.tvMyFriendsListFriendName);
try {
font1 = Typeface.createFromAsset(getActivity().getApplicationContext().getAssets(), Configurationz.Fontz.FONT_1);
tvMyFriendsListFriendName.setTypeface(font1); //this doesnt work.
} catch (Exception e) {
}
}
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
// do something with the data
}
}
这不起作用。我不知道为什么。异常堆栈跟踪表示当我尝试与TextView进行交互时,存在一个nullpointer异常。
这是LogCat所说的截图。右键单击它并查看图像以查看完整大小的视图
编辑:按照我的建议后,我将代码改为:
public class MyProfileFriendsFriendFragmentList extends SherlockListFragment {
private Typeface font1;
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
String[] values = new String[] { "Daddy Yankee", "Michael Schumacher", "Krista Rock",
"Ben Jordan", "Bruce Springsteen", "Jane Carol", "Susan Jackson", "Marshall Mathers",
"Cauth Bodva", "Ringo Starr" };
try {
font1 = Typeface.createFromAsset(getActivity().getApplicationContext().getAssets(), Configurationz.Fontz.FONT_1);
} catch (Exception e) {
}
ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(), R.layout.my_profile_friend_fragment, R.id.tvMyFriendsListFriendName, values) {
@Override
public View getView(int position, View convertView,
ViewGroup parent) {
View rowView = super.getView(position, convertView, parent);
TextView tv = (TextView) rowView.findViewById(R.id.tvMyFriendsListFriendName);
tv.setTypeface(font1);
return rowView;
}
};
}
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
// do something with the data
}
}
现在当我打开那个活动时,它只是无限加载并且没有错误信息?
答案 0 :(得分:1)
当您正在扩展SherlockListFragment
并且该片段中没有onCreateView()
方法时(至少在您发布的代码中没有),您似乎正在尝试更改字体来自TextViews
行的ListView
(您查找带有传递给适配器的ID的TextView
)。你没有以正确的方式做到这一点,你需要对适配器进行一些小改动。
与NullPointerExceptiuon
相关(作为旁注,从不忽略异常,就像使用空catch
子句一样),这种情况正在发生,因为尽管{{1将返回片段(列表)的有效视图,getView()
的行尚未构建,您之前刚刚设置了适配器(它不会立即使列表的行可用)。
要从ListView
行更改Typeface
的{{1}},请尝试以下操作:
TextView
答案 1 :(得分:1)
从截图中,try-catch块中会抛出NPE
:
tvMyFriendsListFriendName = (TextView)
getView().findViewById(R.id.tvMyFriendsListFriendName);
try {
font1 = Typeface.createFromAsset(
getActivity().getApplicationContext().getAssets(),
Configurationz.Fontz.FONT_1);
tvMyFriendsListFriendName.setTypeface(font1); //this doesnt work.
} catch (Exception e) { }
似乎在您的片段布局中未定义TextView
id = tvMyFriendsListFriendName
getView()
。 onCreateView(...)
返回的视图是您在片段onCreateView(...)
中充气的视图。如果您在R.id.tvMyFriendsListFriendName
中使用的布局文件不包含tvMyFriendsListFriendName
,则null
将初始化为tvMyFriendsListFriendName.setTypeface(font1);
,从而导致此行发生异常:
getView(...)
您似乎希望在ListView的项目中设置TextView的字体。为此,您可以覆盖ArrayAdapter的ArrayAdapter<String> adapter =
new ArrayAdapter<String>(getActivity(),
R.layout.my_profile_friend_fragment,
R.id.tvMyFriendsListFriendName, values) {
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v = super.getView(position, convertView, parent);
// 'font1' is the font you get from Typeface.createFromAsset(...)
// So, initialization of 'font1' will have to go before you define
// the ArrayAdapter
((TextView) v.findViewById(R.id.tvMyFriendsListFriendName)).setTypeface(font1);
return v;
}
}
方法并在其中设置字体:
{{1}}