2014-01-22 3 views
0

Я делаю веб-браузер. Я использовал фрагменты для табуляции, но когда пользователь переходит с одной вкладки на другую и обратно, URL-адрес webview сбрасывается, и URL-адрес пользователя теряется. Мой вопрос: как остановить сброс веб-просмотров при переключении фрагментов. Я исследовал левый правый и центр, пытаясь решить это, но не повезло. Спасибо!Остановка самого сброса фрагмента

public class HomeFragment extends Fragment { 

public HomeFragment(){} 

private WebView WebViewB1; 
private ProgressBar Pbar1; 

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

    View rootView = inflater.inflate(R.layout.fragment_home, container, false); 

    Pbar1 = (ProgressBar) rootView.findViewById(R.id.progBar1); 
    WebViewB1 = (WebView) rootView.findViewById(R.id.wvBrowserTab1); 

    WebSettings webSettings = WebViewB1.getSettings(); 
    webSettings.setJavaScriptEnabled(true); 
    WebViewB1.getSettings().setLoadWithOverviewMode(true); 
    WebViewB1.getSettings().setUseWideViewPort(true); 
    WebViewB1.getSettings().setBuiltInZoomControls(true); 
    WebViewB1.getSettings().setAllowFileAccess(true); 

    WebViewB1.setWebViewClient(new InsideWebViewClient()); 
    WebViewB1.setWebChromeClient(new WebChromeClient() { 
     public void onProgressChanged(WebView view, int progress) 
     { 
     if(progress < 100 && Pbar1.getVisibility() == ProgressBar.GONE){ 
      Pbar1.setVisibility(ProgressBar.VISIBLE); 
     } 
     Pbar1.setProgress(progress); 
     if(progress == 100) { 
      Pbar1.setVisibility(ProgressBar.GONE); 
     } 
    } 
}); 

     WebViewB1.loadUrl("http://google.com"); 

    return rootView; 
} 

} 

Раздвижная деятельность меню ниже

public class MainActivity extends Activity { 

private DrawerLayout mDrawerLayout; 
private ListView mDrawerList; 
private ActionBarDrawerToggle mDrawerToggle; 


private CharSequence mDrawerTitle; 

private CharSequence mTitle; 

private String[] navMenuTitles; 
private TypedArray navMenuIcons; 

private ArrayList<NavDrawerItem> navDrawerItems; 
private NavDrawerListAdapter adapter; 

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    mTitle = mDrawerTitle = getTitle(); 

    navMenuTitles = getResources().getStringArray(R.array.nav_drawer_items); 

    navMenuIcons = getResources() 
      .obtainTypedArray(R.array.nav_drawer_icons); 

    mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); 
    mDrawerList = (ListView) findViewById(R.id.list_slidermenu); 

    navDrawerItems = new ArrayList<NavDrawerItem>(); 

    navDrawerItems.add(new NavDrawerItem(navMenuTitles[0], navMenuIcons.getResourceId(0, -1))); 

    navDrawerItems.add(new NavDrawerItem(navMenuTitles[1], navMenuIcons.getResourceId(1, -1))); 

    navDrawerItems.add(new NavDrawerItem(navMenuTitles[2], navMenuIcons.getResourceId(2, -1))); 

    navDrawerItems.add(new NavDrawerItem(navMenuTitles[3], navMenuIcons.getResourceId(3, -1))); 

    navDrawerItems.add(new NavDrawerItem(navMenuTitles[4], navMenuIcons.getResourceId(4, -1))); 

    navDrawerItems.add(new NavDrawerItem(navMenuTitles[5], navMenuIcons.getResourceId(5, -1))); 

    navMenuIcons.recycle(); 

    mDrawerList.setOnItemClickListener(new SlideMenuClickListener()); 

    adapter = new NavDrawerListAdapter(getApplicationContext(), 
      navDrawerItems); 
    mDrawerList.setAdapter(adapter); 

    getActionBar().setDisplayHomeAsUpEnabled(true); 
    getActionBar().setHomeButtonEnabled(true); 

    mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, 
      R.drawable.ic_drawer, 
      R.string.app_name, 
      R.string.app_name 
    ) { 
     public void onDrawerClosed(View view) { 
      getActionBar().setTitle(mTitle); 
      invalidateOptionsMenu(); 
     } 

     public void onDrawerOpened(View drawerView) { 
      getActionBar().setTitle(mDrawerTitle); 
      invalidateOptionsMenu(); 
     } 
    }; 
    mDrawerLayout.setDrawerListener(mDrawerToggle); 

    if (savedInstanceState == null) { 
     displayView(0); 
    } 
} 
private class SlideMenuClickListener implements 
     ListView.OnItemClickListener { 
    @Override 
    public void onItemClick(AdapterView<?> parent, View view, int position, 
      long id) { 
     displayView(position); 
    } 
} 
public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.main, menu); 

    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    if (mDrawerToggle.onOptionsItemSelected(item)) { 
     return true; 
    } 
    switch (item.getItemId()) { 
    case R.id.action_settings: 
     return true; 
    default: 
     return super.onOptionsItemSelected(item); 
    } 
} 

@Override 
public boolean onPrepareOptionsMenu(Menu menu) { 
    boolean drawerOpen = mDrawerLayout.isDrawerOpen(mDrawerList); 
    menu.findItem(R.id.action_settings).setVisible(!drawerOpen); 
    return super.onPrepareOptionsMenu(menu); 
} 

private void displayView(int position) { 
    Fragment fragment = null; 

    switch (position) { 
    case 0: 
     fragment = new HomeFragment(); 
     break; 
    case 1: 
     fragment = new Tab2(); 
     break; 
    case 2: 
     fragment = new Tab3(); 
     break; 
    case 3: 
     fragment = new Tab4(); 
     break; 
    case 4: 
     fragment = new Tab5(); 
     break; 
    case 5: 
     fragment = new Tab6(); 
     break; 

    default: 
     break; 
    } 

    if (fragment != null) { 
     FragmentManager fragmentManager = getFragmentManager(); 
     fragmentManager.beginTransaction() 
       .replace(R.id.frame_container, fragment).commit(); 

     mDrawerList.setItemChecked(position, true); 
     mDrawerList.setSelection(position); 
     setTitle(navMenuTitles[position]); 
     mDrawerLayout.closeDrawer(mDrawerList); 
    } else { 
     Log.e("MainActivity", "Error in creating fragment"); 
    } 
} 

@Override 
public void setTitle(CharSequence title) { 
    mTitle = title; 
    getActionBar().setTitle(mTitle); 
} 

@Override 
protected void onPostCreate(Bundle savedInstanceState) { 
    super.onPostCreate(savedInstanceState); 
    mDrawerToggle.syncState(); 
} 

@Override 
public void onConfigurationChanged(Configuration newConfig) { 
    super.onConfigurationChanged(newConfig); 
    mDrawerToggle.onConfigurationChanged(newConfig); 
} 
} 
+0

Любой код, показывающий, как вы управляете браузером/веб-просмотром в своем фрагменте? – Stan

+0

@Stan Я добавил активность одного из фрагментов. – Tssomas

+1

Убедитесь, что ваш фрагмент не убит системой, когда вы его покинете? похоже, что onCreateView срабатывает каждый раз, когда вы возвращаетесь к фрагменту, и поэтому перезагрузка webview. вы можете попытаться сохранить связанный вид как свойство и проверить, является ли его nulll или нет в onCreate anf, если его нет, а затем просто вернуть его как вид. – Stan

ответ

1

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

if (fragment != null) { 
    FragmentManager fragmentManager = getFragmentManager(); 
    fragmentManager.beginTransaction() 
      .replace(R.id.frame_container, fragment).commit(); 

После создания лучшего tabListener вещи, где A-OK. Проверьте эту ссылку на то, как улучшен приемник вкладок - http://developer.android.com/guide/topics/ui/actionbar.html#Tabs

+1

Насколько я понимаю, вы уже ответили на свой вопрос, но эта тема оказалась для меня действительно полезной, когда вы столкнулись с той же проблемой, которую вы имели в виду: http://stackoverflow.com/questions/13149446/android-fragments-when-to-use- hide-show-or-add-remove-replace – BRS

+1

@rui спасибо, человек! Хотелось бы, чтобы я раньше это видел :) – Tssomas

1

Хорошо, я не уверен, если его хорошая идея, но следующее, что Im говорим о:

public abstract class AbstractFragment extends Fragment { 

     private View mFragmentView; 
     protected View getOnCreateView(LayoutInflater inflater, int layoutId){ 

      if (mFragmentView== null) 
       mFragmentView = inflater.inflate(layoutId, null); 
      else 
       ((ViewGroup) mFragmentView.getParent()).removeView(mFragmentView); 

      return mFragmentView; 
     } 


// this method needed to detect if fragment's view init is needed 
// via initView() - its the method where you do findViewById() 
// and sets up your webveiw, etc. The idea is to set up the view 
// only once - in case when it has not been init-ed 
// this will prevent your webview from reload from the start url 
      protected boolean isFragmentViewInitialized; 
      @Override 
      public void onStart() { 
       super.onStart(); 

       if (!isFragmentViewInitialized){ 
        isFragmentViewInitialized = true; 
        initView(); 
       } 

    } 

     // use this method to setup the view 
     public abstract void initView(); 

Идея заключается в том, чтобы расширить этот фрагмент по каждому фрагменту, который вам нужен, чтобы остаться в живых и назвать его getOnCreateView от onCreate() подобным:

 @Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
      return getOnCreateView(inflater,R.layout.activity_about); 
     } 
     public void initView(){ 
      View rootView = getView(); 
Pbar1 = (ProgressBar) rootView.findViewById(R.id.progBar1); 
    WebViewB1 = (WebView) rootView.findViewById(R.id.wvBrowserTab1); 

    WebSettings webSettings = WebViewB1.getSettings(); 
    webSettings.setJavaScriptEnabled(true); 
    WebViewB1.getSettings().setLoadWithOverviewMode(true); 
    WebViewB1.getSettings().setUseWideViewPort(true); 
    WebViewB1.getSettings().setBuiltInZoomControls(true); 
    WebViewB1.getSettings().setAllowFileAccess(true); 

    WebViewB1.setWebViewClient(new InsideWebViewClient()); 
    WebViewB1.setWebChromeClient(new WebChromeClient() { 
     public void onProgressChanged(WebView view, int progress) 
     { 
     if(progress < 100 && Pbar1.getVisibility() == ProgressBar.GONE){ 
      Pbar1.setVisibility(ProgressBar.VISIBLE); 
     } 
     Pbar1.setProgress(progress); 
     if(progress == 100) { 
      Pbar1.setVisibility(ProgressBar.GONE); 
     } 
    } 
}); 

     WebViewB1.loadUrl("http://google.com"); 
     } 
+0

((ViewGroup) mThisView.getParent()). RemoveView (mFragmentView); «mThisView» не может быть разрешен, я не уверен, что он должен определить. Также вы имеете в виду расширение любых фрагментов, которые я не хочу сбросить с помощью класса AbstractFragment? Спасибо за помощь btw – Tssomas

+1

произошла ошибка ThisView - mFragmentView, поэтому я отредактировал src - должен быть рабочий кусок. И да, я имею в виду. Каждый фрагмент, который вы не хотите сбросить, должен быть расширен из этого AbstractFragment. Также вы должны принять ответ, если его полезно 4u. – Stan

+0

Спасибо за помощь, еще одна проблема. Я настраиваю представление под «public abstract void initView()»; в AbstractFragment src или под текущей. Жаль, что я боюсь, я все еще учусь. :) – Tssomas

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