1

已经一整天了,我正在尝试做我认为这是一项简单的任务:实现一个片段,根据互联网可用性显示不同的视图。

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

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

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

请帮忙!

Youtube 错误画面

编辑:

我可以显示错误视图,我只是在 OnCreateView 方法中检查互联网可用性:

@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();
                }
            }
        }
    });
}
4

2 回答 2

1

请提供一些代码。

我的提示:在主布局中,您应该使用 id=main_fragment 的 FragmentLayout 在活动中创建方法“noInternetView()”,在 id=main_fragment 上显示带有按钮“no internet”的片段

一些代码:

//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();

通过更改 Fragment 使用上面的代码来打开正常的 Fragment

和:

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>
于 2013-09-06T11:55:18.543 回答
1

不要浪费时间,使用这个库:https ://github.com/medyo/dynamicbox

于 2015-04-24T19:48:23.253 回答