2013-10-08 10 views
2

Je crée une application web avec 3 onglets ActionBar. Chaque onglet déclenche un webview. Sur l'un des onglets, j'ai besoin du bouton de retour de l'appareil Android pour déclencher l'action goBack pour ce webview. J'essaye une solution semblable à celle suggérée par blackbelt et netinept chez How to add "Go Back" function in WebView inside Fragment?, mais j'obtiens l'erreur suivante - "la méthode canGoBack() est indéfinie pour le type FragmentTab3" dans mon fichier MainActivity.java.Erreur webview canGoBack() avec le fragment ActionBarSherlock

Voici mon code. S'il te plaît, fais-moi savoir ce que je peux faire de mal.

--- --- MainActivity.java

où je reçois "La méthode canGoBack() est définie pour le type FragmentTab3"

public class MainActivity extends SherlockFragmentActivity { 

    ActionBar.Tab Tab1,Tab2,Tab3; 
    Fragment fragmentTab1 = new FragmentTab1(); 
    Fragment fragmentTab2 = new FragmentTab2(); 
    Fragment fragmentTab3 = new FragmentTab3(); 


    @Override protected void onSaveInstanceState(Bundle outState){ 
     super.onSaveInstanceState(outState); 
     int index = getSupportActionBar().getSelectedNavigationIndex(); 
     outState.putInt("selected_tab_index", index); 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     ActionBar actionBar = getSupportActionBar(); 

     // Hide Actionbar Icon 
     actionBar.setDisplayShowHomeEnabled(false); 

     // Hide Actionbar Title 
     actionBar.setDisplayShowTitleEnabled(false); 

     // Create Actionbar Tabs 
     actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 

     // Set Tab Icon and Titles 
     Tab1 = actionBar.newTab().setText("Tab 1"); 
     Tab2 = actionBar.newTab().setText("Tab 2"); 
     Tab3 = actionBar.newTab().setText("Tab 3"); 


     // Set Tab Listeners 
     Tab1.setTabListener(new TabListener(fragmentTab1)); 
     Tab2.setTabListener(new TabListener(fragmentTab2)); 
     Tab3.setTabListener(new TabListener(fragmentTab3)); 

     // Add tabs to actionbar 
     actionBar.addTab(Tab1); 
     actionBar.addTab(Tab2); 
     actionBar.addTab(Tab3); 

     if (savedInstanceState != null) { 
      int index = savedInstanceState.getInt("selected_tab_index", 0); 
      getSupportActionBar().setSelectedNavigationItem(index); 
     } 

    } 

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

    @Override 
    public void onBackPressed() { 
      Fragment webview = getSupportFragmentManager().findFragmentById(R.id.webview); 
      if (webview instanceof FragmentTab3) { 
       boolean goback = ((FragmentTab3)webview).canGoBack(); 
       if (!goback) 
        super.onBackPressed(); 
      } 
    }  

} 

--- FragmentTab3.java-- -

public class FragmentTab3 extends SherlockFragment 
{ 

    public WebView webView; 

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

     webView = (WebView) rootView.findViewById(R.id.webview); 
     webView.setBackgroundColor(0); 
     webView.getSettings().setJavaScriptEnabled(true); 
     webView.setWebViewClient(new WebViewClient()); 
     webView.loadUrl("http://www.example.com"); 
     webView.requestFocusFromTouch(); 

     return rootView; 
    } 

} 

--- --- fragmenttab3.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" > 

    <WebView 
     android:id="@+id/webview" 
     android:tag="webview_tag" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:layout_weight="1" /> 

</LinearLayout> 

Répondre

0

comme l'indique l'erreur Fragment n'a pas de méthode appelée canGoBack. Vous pouvez le faire de cette façon:

public class FragmentTab3 extends SherlockFragment 
{ 
    /// your code 

    public boolean canGoBack() { 
     return webView != null && webView.canGoBack(); 
    } 

} 
+0

Merci. J'ai ajouté le code que vous avez suggéré et cela ne fonctionne pas encore. J'ai couru le débogueur et j'ai vu que webview est Null à 'Fragment webview = getSupportFragmentManager(). FindFragmentById (R.id.webview);' @blackbelt – user2859868

+0

Toujours en train de faire des tests, mais je l'ai fait fonctionner en changeant 'Fragment webview = getSupportFragmentManager(). findFragmentById (R.id.webview);' 'Fragment webview = getSupportFragmentManager(). findFragmentById (R.id. fragment_container); ' – user2859868

0

Cela a fonctionné pour moi dans mon MainActivity.java J'utilise 4 onglets chacun avec vue sur le Web.

@Override 
public void onBackPressed() { 
    // TODO Auto-generated method stub 
    int currPage = mPager.getCurrentItem(); 
    WebView wv = null; 
    switch (currPage) { 
    case 0: 
     wv = (WebView) mPager.getChildAt(currPage).findViewById(R.id.webView1); 
     break; 
    case 1: 
     wv = (WebView) mPager.getChildAt(currPage).findViewById(R.id.webView2); 
     break; 
    case 2: 
     wv = (WebView) mPager.getChildAt(currPage).findViewById(R.id.webView3); 
     break; 
    case 3: 
     wv = (WebView) mPager.getChildAt(currPage).findViewById(R.id.webView4); 
     break; 
    } 

    if (wv != null) { 
     if (wv.canGoBack()) { 
      wv.goBack(); 
     } else { 
      super.onBackPressed(); 
     } 
    } else { 
     super.onBackPressed(); 
    } 
} 
Questions connexes