2013-09-06 3 views
0

Это был целый день, я пытаюсь сделать то, что, как я думал, это простая задача: реализовать фрагмент, отображающий различные представления на основе доступности Интернета.Как изменить вид фрагмента программно (когда интернет недоступен)

Чтобы быть ясным: попробуйте запустить приложение YouTube без подключения, вы увидите красивый экран с кнопкой «Повторить». Когда вы нажимаете кнопку, фрагмент (только просмотр или что-то еще) перезагружается и, если доступ в Интернет теперь доступен, отображает правильные элементы.

У меня есть два фрагмента внутри ViewPager. Я хочу, чтобы первый фрагмент отображал сообщение об ошибке и кнопку «Повторить». Когда кнопка нажата, как и приложение youtube, я хочу перезагрузить содержимое фрагментов и отобразить правильные файлы, если сеть доступна.

Я попытался заменить весь фрагмент изнутри себя и из основной деятельности, изменив представление программно и на другие вещи, я не имел никакого успеха.

Пожалуйста, помогите!

Youtube error screen

EDIT:

я могу отобразить представление об ошибке, я просто проверить наличие интернет внутри метода 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 
      } 
     }); 

}

EDIT: У меня есть использовал ответ @ daro2189, чтобы решить мою проблему, кто был немного другим: в этом случае мне нужно только изменить v ОДИН из двух фрагментов внутри пейджера представления.

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

ответ

1

Просьба указать код.

Мои советы: В основной раскладке вы должны иметь FragmentLayout с идентификатором = main_fragment В деятельности создать метод «noInternetView()», который показывают на ид = main_fragment фрагмент с кнопкой «без Интернета» Когда нет функции интернет запуска 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(); 

путем изменения кода использования фрагмент выше, чтобы открыть нормальный фрагмент

А:

If(noInternetConnection){ 
    //open fragment with no internet laout - code above 
} else { 
    //open fragment with normal layout 
} 

Я надеюсь, что поможет :)

--- UPDATE -----

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> 
+0

Я могу изменить фрагмент, чтобы отобразить экран ошибки. Я делаю это, просто проверяя наличие соединения в методе OnCreateView. Что я не могу сделать, это изменить представление при нажатии кнопки «Повторить». – JoP

+0

Чтобы изменить макет, вы должны переопределить метод onClick(), а затем использовать функцию проверки макета, понимаете ли вы, что я имею в виду? или я могу предоставить еще какой-нибудь код? –

+0

Пожалуйста, предоставьте мне код. Моя проблема в том, что я не знаю, как изменить макет, я провалил каждую попытку T.T – JoP

1

Не тратьте время на том, что использовать эту библиотеку: https://github.com/medyo/dynamicbox

+0

Просьба представить краткий обзор этой библиотеки. Также скажите, какие конкретные детали могут помочь ответить на этот вопрос и как. Ссылка может измениться в будущем, и ваш ответ должен быть самосогласованным – avalancha

Смежные вопросы