Android 在片段中查找未放入onCreateView的ViewById

Android 在片段中查找未放入onCreateView的ViewById,android,fragment,Android,Fragment,我想知道是否可以在onCreateView方法之外设置我的TextView 下面是在Android studio上成功运行的代码 public class TabMatchFragmentOdd extends Fragment { TextView Home, Away; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstan

我想知道是否可以在onCreateView方法之外设置我的TextView

下面是在Android studio上成功运行的代码

public class TabMatchFragmentOdd extends Fragment {
    TextView Home, Away;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.tab_match_odd, container, false);
        Home = (TextView) v.findViewById(R.id.homename);
        Away = (TextView) v.findViewById(R.id.awayname);
        getIncomingIntent();

        return v;
    }

    private void getIncomingIntent() {
        if (getActivity().getIntent().hasExtra("HomeName") && getActivity().getIntent().hasExtra("AwayName")) {
            String HomeName = getActivity().getIntent().getStringExtra("HomeName").toString();
            String AwayName = getActivity().getIntent().getStringExtra("AwayName").toString();
            setContent(HomeName,AwayName);        
        } else {
            Toast.makeText(getActivity(), "No", Toast.LENGTH_SHORT).show();
        }
    }

    private void setContent(String home, String away) { 
        Home.setText(home);
        Away.setText(away);
    }
}
但我想通过具体的方法使我的代码更加清晰

我可以用上面类似的方法吗

public class TabMatchFragmentOdd extends Fragment {
    TextView Home, Away;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View v;
         v = inflater.inflate(R.layout.tab_match_odd, container, false);
        getIncomingIntent();
        return v;

    }

    private void getIncomingIntent() {
        if(getActivity().getIntent().hasExtra("HomeName")&&getActivity().getIntent().hasExtra("AwayName")) {
            String HomeName = getActivity().getIntent().getStringExtra("HomeName").toString();
            String AwayName = getActivity().getIntent().getStringExtra("AwayName").toString();
            setContent(HomeName,AwayName);         
        }else{
            Toast.makeText(getActivity(), "No:", Toast.LENGTH_SHORT).show();
        }
    }

    private void setContent(String home, String away) {
        Home = (TextView) getActivity().findViewById(R.id.homename);
        Away = (TextView) getActivity().findViewById(R.id.awayname);      
        Home.setText(home);
        Away.setText(away);
    }
}
运行应用程序后,它会给我一个NullPointException

无论我使用getActivity还是getView,它都不起作用

这背后的概念是什么?

片段的布局与活动的布局无关,因此getActivity.findViewById将失败

在展开布局后的onCreateView中,执行以下操作:

Home = (TextView) v.findViewById(R.id.homename);
一些编码风格提示:将TextView的访问设置为私有。命名它们时,以小写字母开头,并在结尾附加Tv,这样您就知道这个私有字段是一个TextView

片段的布局与活动的布局无关,因此getActivity.findViewById将失败

在展开布局后的onCreateView中,执行以下操作:

Home = (TextView) v.findViewById(R.id.homename);
一些编码风格提示:将TextView的访问设置为私有。命名它们时,以小写字母开头,并在末尾附加Tv,以便您知道此专用字段是文本视图

首先关于膨胀视图:

此代码如下:

View v;
v = inflater.inflate(R.layout.tab_match_odd, container, false);
膨胀视图,这意味着它接受xml文件并只创建所有这些对象。因此,在此之后,v是一个视图,它包含xml中定义的所有其他视图。这就是为什么您可以使用:

(TextView) v.findViewById(R.id.awayname);
因为这个文本视图是definec内部视图

getView和getActivity的区别

另一件事是,您的片段由活动托管。它还通过使用setContentView使其视图膨胀。。。方法通过此操作,您可以使用Activity.findViewById,并且您将能够在setContentView中的Activity的xml文件集中找到膨胀的视图。 这就是为什么:

(TextView) v.findViewById(R.id.awayname);
工作,以及

(TextView) getActivity().findViewById(R.id.awayname);
没有。Activity只是没有扩展包含R.id.awayname的视图。 如您所见:getActivity只返回承载片段的活动,而getView返回从onCreateView方法返回的视图

为什么getView生成null

这是因为在onCreateView返回语句之前使用了getView方法

怎么办

要使其工作,明智的做法是在片段/活动内部创建如下属性:

公共类TabMatchFragmentOdd扩展了片段{ TextView Home,Away

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
Bundle savedInstanceState) {
    View v;
    v = inflater.inflate(R.layout.tab_match_odd, container, false);
    getViews(v);
    return v;
}

private void getIncomingIntent() {
    (...)
    setContent(HomeName,AwayName);         
}

private void getViews(View v) {
    Home = (TextView) v.findViewById(R.id.homename);
    Away = (TextView) v.findViewById(R.id.awayname);      
}

private void setContent(String home, String away) {
    Home.setText(home);
    Away.setText(away);   
}
首先,关于膨胀视图:

此代码如下:

View v;
v = inflater.inflate(R.layout.tab_match_odd, container, false);
膨胀视图,这意味着它接受xml文件并只创建所有这些对象。因此,v之后是一个包含xml中定义的所有其他视图的视图。这就是为什么可以使用:

(TextView) v.findViewById(R.id.awayname);
因为这个文本视图是definec内部视图

getView和getActivity的区别

另一件事是,您的片段由Activity托管。它的视图也通过使用setContentView…方法膨胀。通过使用Activity.findViewById,您将能够在setContentView中的Activity的xml文件集中找到膨胀的视图。 这就是为什么:

(TextView) v.findViewById(R.id.awayname);
工作,以及

(TextView) getActivity().findViewById(R.id.awayname);
没有。活动只是没有膨胀包含R.id.awayname的视图。 如您所见:getActivity只返回承载片段的活动,而getView返回从onCreateView方法返回的视图

为什么getView生成null

这是因为在onCreateView返回语句之前使用了getView方法

怎么办

要使其工作,明智的做法是在片段/活动内部创建如下属性:

公共类TabMatchFragmentOdd扩展了片段{ TextView Home,Away

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
Bundle savedInstanceState) {
    View v;
    v = inflater.inflate(R.layout.tab_match_odd, container, false);
    getViews(v);
    return v;
}

private void getIncomingIntent() {
    (...)
    setContent(HomeName,AwayName);         
}

private void getViews(View v) {
    Home = (TextView) v.findViewById(R.id.homename);
    Away = (TextView) v.findViewById(R.id.awayname);      
}

private void setContent(String home, String away) {
    Home.setText(home);
    Away.setText(away);   
}
运行应用程序后,它出现了nullpointexception错误

无论我使用getActivity还是getView,它都不起作用

这背后的概念是什么

调用getView时,将得到以下结果:

如果onCreateView尚未完成,则getView返回null 如果onCreateView已完成,则getView将返回在onCreateView中返回的内容 在代码中,setContent由getIncomingIntent调用,onCreateView调用它。这意味着onCreateView尚未完成,因此getView此时将始终返回null

您可以对第二段代码进行的最小更改是将getIncomingIntent调用从onCreateView移到onViewCreated:

运行应用程序后,它出现了nullpointexception错误

无论我使用getActivity还是getView,它都不起作用

这背后的概念是什么

调用getView时,将得到以下结果:

如果onCreateView尚未完成,则getView返回null 如果onCreateView已完成,则getView将返回在onCreateView中返回的内容 在代码中,setContent由getIncomingIntent调用,onCreateView调用它。这意味着onCreateView尚未完成,因此getView此时将始终返回null

对第二个代码段所做的最小更改 代码的作用是将getIncomingIntent调用从onCreateView移到onViewCreated:


非常感谢你的解释,我明白了!非常感谢你的解释,我明白了!谢谢你,Rene,现在我知道了片段和活动之间的区别,你的编码技巧真的很有用,欢迎你!当然还有更多的事情要做;想象一下,当膨胀布局时,返回的视图是根元素,findViewById得到的所有视图都在它下面。注意,我这样描述它,所以你可以更好地想象它。不管怎样,如果你还有什么问题,尽管问吧!再次感谢你花了这么多时间:现在我知道了谢谢你,Rene,现在我知道了片段和活动之间的区别,你的编码技巧真的很有用,欢迎你!当然还有更多的事情要做;想象一下,当膨胀布局时,返回的视图是根元素,findViewById得到的所有视图都在它下面。注意,我这样描述它,所以你可以更好地想象它。不管怎样,如果你还有什么问题,尽管问吧!再次感谢您花费这么多时间:现在我收到了Hanks Ben,我从您的OnViewCreated方法中学到了一些新东西,谢谢Ben,我从您的OnViewCreated方法中学到了一些新东西,