Android 如何以编程方式将视图更改为片段(当internet不可用时)

Android 如何以编程方式将视图更改为片段(当internet不可用时),android,android-fragments,Android,Android Fragments,这已经是一整天了,我一直在努力做我认为很简单的事情:实现一个片段,根据互联网的可用性显示不同的视图 需要明确的是:尝试在没有连接的情况下启动youtube应用程序,你会看到一个漂亮的错误屏幕,上面有一个“重试”按钮。当您单击按钮时,片段(仅视图或其他内容)将重新加载,如果internet现在可用,则显示正确的项目 我在一个ViewPager里有两个片段。我希望第一个片段显示一条错误消息和一个“重试”按钮。当按下按钮时,就像youtube应用程序一样,如果网络可用,我想重新加载片段的内容并显示正确

这已经是一整天了,我一直在努力做我认为很简单的事情:实现一个片段,根据互联网的可用性显示不同的视图

需要明确的是:尝试在没有连接的情况下启动youtube应用程序,你会看到一个漂亮的错误屏幕,上面有一个“重试”按钮。当您单击按钮时,片段(仅视图或其他内容)将重新加载,如果internet现在可用,则显示正确的项目

我在一个ViewPager里有两个片段。我希望第一个片段显示一条错误消息和一个“重试”按钮。当按下按钮时,就像youtube应用程序一样,如果网络可用,我想重新加载片段的内容并显示正确的内容

我试着从内部和主活动中替换整个片段,以编程方式更改视图和其他内容,但没有成功

请帮忙

编辑:

我可以显示错误视图,我只需检查OnCreateView方法中的internet可用性:

@Override
public View onCreateView(final LayoutInflater inflater, final ViewGroup container, final Bundle savedInstanceState) {

    final View view;

    if(CheckNetwork.isInternetAvailable(getActivity())){

        view = inflater.inflate(R.layout.fragment_with_connection, container, false);
    }
    else{
        view = inflater.inflate(R.layout.layout_no_connectivity, container, false);
        Button button = (Button)view.findViewById(R.id.button_retry);
        button.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View mview) {


                //DUNNO WAT TO DO
            }
        });
}

编辑: 我使用@daro2189的答案来解决我的问题,他与我略有不同:在本例中,我只需要更改视图寻呼机中两个片段中的一个片段的视图

@Override
public View onCreateView(final LayoutInflater inflater, final ViewGroup container, final Bundle savedInstanceState) {

    View view = inflater.inflate(R.layout.fragment_with_connection, container, false);

    initNoInternetView(view);

    if (!CheckNetwork.isInternetAvailable(getActivity())) {

        if (noInternetView != null) {
            View child = view.findViewById(R.id.child );
            child.setVisibility(View.GONE);
            noInternetView.setVisibility(View.VISIBLE);
        }
    } else {

        getInfoFromInternet();
    }

    return view;
}

private void initNoInternetView(final View view) {
    if(view == null)
        return;


    RelativeLayout parentView = (RelativeLayout)view.findViewById(R.id.layout_no_connectivity);

    LayoutInflater inflater = (LayoutInflater)getActivity().getSystemService(getActivity().LAYOUT_INFLATER_SERVICE);
    noInternetView = inflater.inflate(R.layout.layout_no_connectivity, null);
    noInternetView.setVisibility(View.GONE);
    parentView.addView(noInternetView);

    final Button button = (Button)noInternetView.findViewById(R.id.button_retry);
    button.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View mview) {
            if(!CheckNetwork.isInternetAvailable(getActivity())){
                if(noInternetView != null){
                    noInternetView.setVisibility(View.VISIBLE);
                    noInternetView.bringToFront();
                }
            } else {
                if(noInternetView != null){
                    noInternetView.setVisibility(View.GONE);
                    View child = view.findViewById(R.id.child);
                    child.setVisibility(View.VISIBLE);
                    getInfoFromInternet();
                }
            }
        }
    });
}

请提供一些代码

我的建议: 在主布局中,应该有id为main\u fragment的FragmentLayout 在活动创建方法“noInternetView()”中,该方法在id=main上显示一个带有按钮“no internet”的片段 当没有internet运行函数noInternetView()时,其他显示正常视图

一些代码:

//This code put into noInterneView() - because it opens fragment with no internet layout
FragmentTransaction ft = getActivity().getFragmentManager().beginTransaction();
NoInternetFragment bdf = new NoInternetFragment();
ft.replace(R.id.main_fragment, bdf);
ft.addToBackStack(null);
ft.commit();
通过更改片段,使用上面的代码打开普通片段

以及:

我希望我能帮忙:)

---更新-----

private View noInternetView=null;
@凌驾
创建视图上的公共视图(最终布局扁平充气机、最终视图组容器、最终捆绑保存状态){
视图=充气机。充气(R.layout.fragment_,带_连接,容器,假);
initNoInternetView(视图);
如果(!CheckNetwork.isInternetAvailable(getActivity())){
如果(noInternetView!=null)
noInternetView.setVisibility(View.VISIBLE);
}
}
私有void initNoInternetView(视图){
如果(视图==null)
返回;
RelativeLayout parentView=(RelativeLayout)view.findViewById(R.id.parent_视图);
LayoutFlater充气器=(LayoutFlater)getSystemService(Context.LAYOUT\u充气器\u服务);
noInternetView=充气机。充气(R.layout.layout\u无连接,空);
parentView.addView(noInternetView);
final Button Button=(Button)noInternetView.findviewbyd(R.id.Button\u重试);
setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图mview){
如果(!CheckNetwork.isInternetAvailable(getActivity())){
如果(noInternetView!=null){
noInternetView.setVisibility(View.VISIBLE);
noInternetView.bringToFront();
}
}否则{
如果(noInternetView!=null)
noInternetView.setVisibility(View.GONE);
}
}
});
}
//XML布局
//记住,在xml布局(带有连接的片段)中,您的主布局是一个id为parent的//RelativeLayout视图
//大概是这样的:
//这是你的浏览页面

不要浪费时间,使用这个库:

我可以更改片段以显示错误屏幕。我通过简单地检查OnCreateView方法中的连接可用性来实现这一点。我不能做的是在按下“重试”按钮时更改视图。要更改布局,必须重写onClick()方法,然后使用函数检查布局,您明白我的意思吗?或者我可以提供更多的代码吗?请提供一些代码。我的问题是我不知道如何改变布局,我每次都失败了。谢谢!我终于做到了!我的问题稍有不同:我只需要更改视图页面中两个片段中的一个片段的视图(我在问题中写了一些错误)。请提供此库的简要概述。还要说明哪些具体部分可能有助于回答这个问题,以及如何回答。这个链接将来可能会改变,你的答案应该是自洽的
If(noInternetConnection){
  //open fragment with no internet laout - code above
} else {
   //open fragment with normal layout
}
private View noInternetView = null;

@Override
public View onCreateView(final LayoutInflater inflater, final ViewGroup container, final Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_with_connection, container, false);

    initNoInternetView(view);

    if(!CheckNetwork.isInternetAvailable(getActivity())){
        if(noInternetView != null)
            noInternetView.setVisibility(View.VISIBLE);
    }
}

private void initNoInternetView(View view){
    if(view == null)
        return;

    RelativeLayout parentView = (RelativeLayout)view.findViewById(R.id.parent_view);

    LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    noInternetView = inflater.inflate(R.layout.layout_no_connectivity, null);
    parentView.addView(noInternetView);

    final Button button = (Button)noInternetView.findViewById(R.id.button_retry);
    button.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View mview) {
            if(!CheckNetwork.isInternetAvailable(getActivity())){
                if(noInternetView != null){
                    noInternetView.setVisibility(View.VISIBLE);
                    noInternetView.bringToFront();
                }
            } else {
                if(noInternetView != null)
                    noInternetView.setVisibility(View.GONE);
            }
        }
    });
}
//XML layout
//Remember to in xml layout (fragment_with_connection) your main layout was a    //RelativeLayout with id parent_view

    //something like this:



 <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/parent_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent">


    //here put your view pager

    </RelativeLayout>