如何与片段的视图进行交互

时间:2013-11-25 12:23:43

标签: android android-fragments

我有一个活动获取一些片段并将它们放入列表中。 其中一个片段有一个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所说的截图。右键单击它并查看图像以查看完整大小的视图 enter image description here

编辑:按照我的建议后,我将代码改为:

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

      }
}

现在当我打开那个活动时,它只是无限加载并且没有错误信息?

2 个答案:

答案 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}}