2016-07-25 8 views
0

Ich lade lokalen htmls in Webview mit Viewpager. Dies funktioniert einwandfrei und die richtige Seite wird aus dem WebViewFragment in die Ansichtspageraktivität geladen. Scrollen oder Streichen funktioniert einwandfrei, aber ich habe eine Menüschaltfläche hinzugefügt, um den Titel der aktuellen Webansicht abzurufen und darauf zu tippen. Diese Menüschaltfläche gibt den Webview-Titel der nächsten 2 Webview-Seiten im Viewpager zurück.Menü-Taste auf ViewPager toasts falsche Position

Durch das Reduzieren von setOfScreenLimit auf 1 wird der Webview-Titel der nächsten Webview-Seite im viewpager geröstet. Ich kannOfScreenLimit nicht auf 0 setzen. Was ist der wahrscheinlichste Weg, um den WebView-Titel des aktuellen Elements zu erhalten, wenn auf die Menüschaltfläche geklickt wird. Ich muss das bekommen und in einer Datenbank speichern.

Code:

ViewPager

ViewPager pager = (ViewPager) findViewById(R.id.pager); 
    TabsPagerAdapterEnglish pageAdapter = new TabsPagerAdapterEnglish(getSupportFragmentManager()); 

    Bundle extras = getIntent().getExtras(); 
    int value = 0; 
    if (extras != null) { 
     value = extras.getInt("keyHTML"); 
    } 

    pager.setAdapter(pageAdapter); 
    pager.setCurrentItem(value); 
    pager.setOffscreenPageLimit(1); 

Adapter

public class TabsPagerAdapterEnglish extends FragmentPagerAdapter { 
    private static int NUM_ITEMS = 3 

    public TabsPagerAdapterEnglish(FragmentManager fragmentManager) { 
     super(fragmentManager); 
    } 

    // Returns total number of pages 
    @Override 
    public int getCount() { 
     return NUM_ITEMS; 
    } 

    // Returns the fragment to display for that page 
    @Override 
    public Fragment getItem(int position) { 
     switch (position) { 
      case 0: 
       return WebFragmentEnglish.newInstance(0, "file:///android_asset/page1.html"); 
      case 1: 
       return WebFragmentEnglish.newInstance(1, "file:///android_asset/page2.html"); 
      case 2: 
       return WebFragmentEnglish.newInstance(2, "file:///android_asset/page3.html"); 

      default: 
       return null; 
     } 
    } 

    @Override 
    public CharSequence getPageTitle(int position) { 
    } 

    } 

WebFragment

public class WebFragmentEnglish extends Fragment { 

// newInstance constructor for creating fragment with arguments 
public static WebFragmentEnglish newInstance(int position, String url) { 
    WebFragmentEnglish fragmentFirst = new WebFragmentEnglish(); 
    Bundle args = new Bundle(); 
    args.putInt("page_position", position); 
    args.putString("keyHTML", url); 
    fragmentFirst.setArguments(args); 
    return fragmentFirst; 
} 

// Store instance variables based on arguments passed 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setHasOptionsMenu(true); 

    Toolbar toolbar = (Toolbar) getActivity().findViewById(R.id.toolbar); 

    if (null != toolbar) { 
     toolbar.setNavigationIcon(R.drawable.abc_ic_ab_back_mtrl_am_alpha); 
    } 

    position = getArguments().getInt("page_position", 0); 
    url = getArguments().getString("keyHTML"); 

    toolbar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() { 
     @Override 
     public boolean onMenuItemClick(MenuItem item) { 
      switch (item.getItemId()) { 
       case android.R.id.home: 
        getActivity().finish(); 
       case R.id.action_addtofav: 
        webView = (WebView) getActivity().findViewById(R.id.webView1); 
        htitle = webView.getTitle(); 
        saveData(); 
        Toast.makeText(getActivity(), htitle + " added to favorite", 
          Toast.LENGTH_SHORT).show(); 
        return true; 
      } 
      return false; 
     } 
    }); 
} 

// Inflate the view for the fragment based on layout XML 
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.webview, container, false); 

    webView = (WebView) view.findViewById(R.id.webView1); 
    progressBar = (ProgressBar) view.findViewById(R.id.progressBar); 

    progressBar.setMax(100); 

    webView.setWebViewClient(new WebViewClientDemo()); 
    webView.setWebChromeClient(new WebChromeClientDemo()); 
    webView.setInitialScale(1); 
    webView.getSettings().setJavaScriptEnabled(true); 
    webView.getSettings().setLoadWithOverviewMode(true); 
    webView.getSettings().setUseWideViewPort(true); 
    webView.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY); 
    webView.getSettings().setPluginState(WebSettings.PluginState.ON); 
    webView.getSettings().setLoadsImagesAutomatically(true); 
    webView.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY); 
    webView.setScrollbarFadingEnabled(false); 
    webView.getSettings().setBuiltInZoomControls(true); 
    webView.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY); 
    webView.setOnLongClickListener(new View.OnLongClickListener() { 

     @Override 
     public boolean onLongClick(View arg0) { 
      // TODO Auto-generated method stub 
      return true; 
     } 
    }); 
    webView.setLongClickable(false); 
    webView.setWebChromeClient(new WebChromeClient() { 
     public void onProgressChanged(WebView view, int progress) { 

      progressBar.setProgress(progress); 

     } 
    }); 
    webView.loadUrl(url); 
    return view; 
} 
+0

Ich schätze der Fehler ist in der Controller-Implementierung oder auf ViewPager Setup, aber kann nicht bestätigen, bis einige Code zu sehen – Chisko

+0

@Chisko Vielen Dank für Ihre Eingabe. Ich habe Code hinzugefügt. Bitte prüfe. –

+0

Eine andere Sache, wenn eine Taste gedrückt wird, um den Titel aus dem von WebViewFragment aufgeblähten Layout zu rösten, ertönt der richtige Titel. aber mit dem Menü-Button toasten Sie die Kachel der nächsten Webview-Seite. Mein Gedanke ist, dass der Menü-Button durch die Viewpager-Aktivität gesteuert wird und so in gewisser Weise eingreift. –

Antwort

0

ViewPager wird die aktuelle Seite und die nächste Seite (n) bis zu der Last offScreenLimit. Um den Namen der aktuellen Seite zu erhalten, müssen Sie die aktuelle Position des Adapters ermitteln.

Es ist schwer, spezifischere Hilfe zu geben, ohne Code veröffentlicht zu haben. Sie können jedoch die ViewPager-Methode getCurrentItem verwenden, um den sichtbaren Index abzurufen. Von dort können Sie es entweder mit dem Index der Seite vergleichen, die Sie anzeigen (dies funktioniert, wenn der Ansichtspager statisch ist und Seiten im Voraus bekannt sind), oder Sie können diesen Index verwenden, um das Fragment vom PagerAdapter zu erhalten und a aufzurufen Methode, um den Namen zu speichern.

+0

Danke, Code wurde hinzugefügt @Ben. Wenn eine Taste gedrückt wird, um den Titel von innerhalb des von WebViewFragment aufgeblähten Layouts zu rösten, ertönt der richtige Titel. aber mit dem Menü-Button toasten Sie die Kachel der nächsten Webview-Seite. Mein Gedanke ist, dass der Menü-Button durch die Viewpager-Aktivität gesteuert wird und so in gewisser Weise eingreift. –

0

Ich konnte das Problem mit dem ViewPager lösen.

Ich habe die Toolbar-Instanz aus dem Fragment entfernt, um die in der Aktivität des Viewpagers zu verwenden. Da ist in meinem Optionsmenü, würden Sie feststellen, ich verwendet

webView = (WebView) **getActivity().**findViewById(R.id.webView1); 

ich diese vollständig entfernt, da ich bereits in der onCreateView definiert haben, denke ich, vielleicht ist es wegen der getActivity Feld I hinzugefügt, um die Webansicht ID zu lokalisieren .

Ich habe einen alten Code aktualisiert, ich bin froh, dass ich das lösen konnte. Danke @Chisko und @Ben