5

J'ai un listview personnalisé qui est rempli avec webview. Je veux utiliser le zoom avant/arrière pour mon webview. Mais je n'obtiens pas le pincement zoom avant/arrière de manière flexible quand je pince le webview il déclenche le listview's de haut en bas.webview à l'intérieur de la liste: Touch conflits d'événements Impossible donc de pincer Zoom IN/OUT en android

Comment puis-je gérer l'événement UP/DOWN de défilement pour le listview et de pincer pour webview simultanément.

ici est mon listview_layout.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" > 

ListView 
    android:id="@+id/listReader" 
    android:layout_width="match_parent" 
    android:layout_height="fill_parent" 
    android:layout_below="@+id/readerHeader" 
    android:divider="@android:color/background_dark" 
    android:dividerHeight="5dp" > 
</ListView> 

voici mon webview_layour.xml

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:orientation="vertical" > 

<WebView 
    android:id="@+id/webView1" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:layout_alignParentTop="true" 
    android:layout_centerHorizontal="true" 
    android:clickable="true" 
    android:focusable="false" 
    android:focusableInTouchMode="false" 
    android:scrollbars="none" /> 
</RelativeLayout> 

et voici mon java file

public class WebViewBookReader extends Activity { 
static final String URL = "http://www.XXXXXXXX.com/requesthandler.ashx"; 
static final String KEY_ITEM_LOGIN = "Result"; // parent node 
static final String KEY_STATUS = "Status"; 
static final String KEY_CUSTOMERID = "CustomerID"; 
static final String KEY_FNAME = "FirstName"; 

ArrayList<String> URLs = null; 
Activity act = this; 
LayoutInflater inflater = null; 
Context context = WebViewBookReader.this; 

InputMethodManager imm; 
SharedPreferences presForLastLogin; 
ImageAdapter adapter; 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.book_reader_layout); 

    imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 
    getInfo = getIntent(); 

    URLs = new ArrayList<String>(); 
    listView = (ListView) findViewById(R.id.listReader); 

    cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 



@Override 
protected void onStart() { 

    super.onStart(); 


    if (cm.getActiveNetworkInfo() != null 
      && cm.getActiveNetworkInfo().isAvailable() 
      && cm.getActiveNetworkInfo().isConnected()) { 

     new LoadBookPages().execute(""); 
    } else { 
     Toast.makeText(
       context, 
       "Connectivity Error..!\nNo any active Internet Connection Found.", 
       Toast.LENGTH_LONG).show(); 
    } 

} 

public class ImageAdapter extends BaseAdapter { 

    public ImageAdapter(Context c) { 
     context = c; 
    } 

    // ---returns the number of images--- 
    public int getCount() { 
     return URLs.size(); 

    } 

    public ImageAdapter(Context ctx, Activity act) { 
     inflater = (LayoutInflater) act 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    } 

    // ---returns the ID of an item--- 
    public Object getItem(int position) { 
     return position; 
    } 

    public long getItemId(int position) { 
     return position; 
    } 

    // ---returns an ImageView view--- 
    public View getView(final int position, View convertView, 
      ViewGroup parent) { 

     // ImageView bmImage; 

     View vi = convertView; 
     if (convertView == null) { 
      vi = inflater.inflate(R.layout.book_reader_list_style, parent, 
        false); 
      holder = new ViewHolder(); 

      holder.webView = (WebView) vi.findViewById(R.id.webView1); 

      // holder.webView.setInitialScale(scaleWebView); 
      WebSettings webSettings = holder.webView.getSettings(); 
      holder.webView.setVerticalScrollBarEnabled(false); 
      holder.webView.setHorizontalScrollBarEnabled(false); 
      holder.webView.setVisibility(View.VISIBLE); 
      webSettings.setLoadWithOverviewMode(true); 
      webSettings.setUseWideViewPort(false); 

      webSettings.setBuiltInZoomControls(true); 
      webSettings.setSupportZoom(true); 
      webSettings.setLoadWithOverviewMode(true); 

      holder.webView.setOnClickListener(new OnClickListener() { 

       @Override 
       public void onClick(View v) { 
        Log.i("Webview", "Clicked"); 

       } 
      }); 

      vi.setTag(holder); 
     } else { 

      holder = (ViewHolder) vi.getTag(); 
     } 

     holder.webView 
       .loadDataWithBaseURL(
         null, 
         "<!DOCTYPE html><html><body style = \"text-align:center\"><img style=\"border-style:dotted;border-width:5px;border-color:black;\" src= " 
           + URLs.get(position) 
           + " alt=\"page Not Found\"></body></html>", 
         "text/html", "UTF-8", null); 

     return vi; 

    } 
} 

class ViewHolder { 
    WebView webView; 
    ImageButton btnZoomIn; 
    ImageButton btnZoomOut; 

} 

class LoadBookPages extends AsyncTask<String, Integer, String> { 
    ImageAdapter adapter = new ImageAdapter(context, act); 
    ProgressDialog progressDialog; 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     progressDialog = ProgressDialog.show(context, "Loading Book...", 
       "Please Wait..."); 
    } 

    @Override 
    protected String doInBackground(String... params) { 

     for (int i = 1; i <= bookPageCount; i++) { 
      URLs.add(bookLink + i + ".jpg"); 
      publishProgress(i); 

     } 

     return null; 
    } 

    @Override 
    protected void onProgressUpdate(Integer... values) { 

     super.onProgressUpdate(values); 

     progressDialog.setMessage(values[0] 
       + " Page(s) Loaded \nPlease wait..."); 

    } 

    @Override 
    protected void onPostExecute(String result) { 

     super.onPostExecute(result); 
     Toast.makeText(context, "Page No. " + pageNo, Toast.LENGTH_SHORT) 
       .show(); 
     listView.setAdapter(adapter); 
     listView.requestFocus(); 
     progressDialog.dismiss(); 
     listView.setSelection(pageNo - 1); 
    } 

} 

private class UIThread_BookMark extends AsyncTask<String, Integer, String> { 

    ProgressDialog progressDialog; 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 

     progressDialog = ProgressDialog.show(context, "BookMarking...", 
       "Please Wait..."); 
    } 

    @Override 
    protected String doInBackground(String... params) { 

     String URL = params[0]; 

     XMLParser parser = new XMLParser(); 

     String XMLString = parser.getXmlFromUrl_BookMark(URL, 
       Home.CustomerID, Integer.valueOf(bookID), pageNo); 
     Document doc = parser.getDomElement(XMLString); 
     NodeList nl = doc.getElementsByTagName(KEY_ITEM_LOGIN); 
     Element e = (Element) nl.item(0); 

     loginStatus = parser.getValue(e, KEY_STATUS); 

     if (loginStatus.equals("OK")) { 

      publishProgress(1); 

     } else { 

      publishProgress(0); 
     } 
     return null; 
    } 

    @Override 
    protected void onProgressUpdate(Integer... values) { 
     super.onProgressUpdate(values); 
     if (values[0] == 1) { 

      Toast.makeText(context, "BookMark Successful", 
        Toast.LENGTH_SHORT).show(); 

      if (getInfo.getStringExtra("CHECK_FOR_NOWREADING") 
        .equals("YES")) { 
       NowReading.pageNoReadingNow.set(
         getInfo.getIntExtra("BOOK_NO_INLIST", pageNo), 
         pageNo + ""); 
       Toast.makeText(context, "BookMark Updated", 
         Toast.LENGTH_SHORT).show(); 
       BookOverView.updatePageFlag = true; 
       BookOverView.tempPageNo = pageNo + ""; 
      } else { 
       NowReading.BookTitle = null; 
       NowReading.BookRating = null; 
       NowReading.BookDescription = null; 
       NowReading.BookCoverPhotos = null; 
       NowReading.BookAuther = null; 
       NowReading.BookPublishDate = null; 
       NowReading.BookCode = null; 
       NowReading.BookID = null; 
       NowReading.BookPageCount = null; 
       NowReading.bitmapArray = null; 
       NowReading.pageNoReadingNow = null; 
       BookOverView.updatePageFlag = false; 
      } 

     } else if (values[0] == 0) { 
      Toast.makeText(context, "Already BookMarked.", 
        Toast.LENGTH_LONG).show(); 
     } 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     super.onPostExecute(result); 
     progressDialog.dismiss(); 
    } 
} 
} 
+0

w8ing encore pour la réponse –

+0

Cette question a une prime ouverte vaut la réputation de Qadir 50 Hussain se terminant en 3 jours. –

Répondre

6

vous devez mettre en œuvre écouteur setOnTouchListener sur webView et écrire cette instruction à l'intérieur OnTouch()

webView.setOnTouchListener(new View.OnTouchListener() { 

    @Override 
    public boolean onTouch(View v, MotionEvent event) {      

     if(event.getAction()==MotionEvent.ACTION_UP){ 
      webView.getParent().requestDisallowInterceptTouchEvent(false); 

     }else         
      webView.getParent().requestDisallowInterceptTouchEvent(true); 

     return false; 
    } 

}); 

pour plus de détails

http://developer.android.com/reference/android/view/ViewParent.html#requestDisallowInterceptTouchEvent%28boolean%29

Edité

Detecting pinch in Android

How to detect the pinch-zoom event with OnGestureListener in Android?

http://www.krvarma.com/2010/10/multi-touch-in-android/

http://code.almeros.com/android-multitouch-gesture-detectors#.UP4qp4Zu_ox

+0

j'ai essayé ceci .. cela n'affecte pas beaucoup. Y at-il un moyen de reconnaître lorsque l'utilisateur pincer avec deux doigts ou les pouces? –

+0

oui vous devez implémenter le détecteur de mouvement sur webview avec l'écouteur onTouch. En utilisant cet appel, le parent.requestDisallInterceptTouchEvent (true) espère que vous avez travaillé pour vous – Pratik

+0

pouvez-vous poster le code s'il vous plaît. Je suis un novice du détecteur de gestes et de l'écoute tactile. –

0

Je l'ai fait chose avec 2 vues de défilement. Peut être cela peut vous aider un peu. voici mon code:

ScrollView s_parent=(ScrollView)detailView.findViewById(R.id.parent_scroll); 
        ScrollView s_child=(ScrollView)detailView.findViewById(R.id.child_scroll); 
        s_child.setOnTouchListener(new View.OnTouchListener() { 


         @Override 
         public boolean onTouch(View v, MotionEvent event) { 
          // TODO Auto-generated method stub 
          //Log.v("scrooll_touch","CHILD TOUCH"); 
          // Disallow the touch request for parent scroll on touch of child view 
           v.getParent().requestDisallowInterceptTouchEvent(true); 
           return false; 

         } 
        }); 

        s_parent.setOnTouchListener(new View.OnTouchListener() { 

         public boolean onTouch(View v, MotionEvent event) { 
          // Log.v("scrooll_touch","PARENT TOUCH"); 
          findViewById(R.id.child_scroll).getParent().requestDisallowInterceptTouchEvent(false); 
          return false; 
         } 
        }); 
+0

comme j'ai utilisé le listview personnalisé qui gonfle un webview qui réside dans un autre fichier XML séparé. nous ne pouvons pas les considérer comme parents et enfants l'un de l'autre. S'il vous plaît voir mes fichiers XML ci-dessus. peut-être que je me trompe –

+0

ok .. pouvez-vous me dire ce que vous affichez dans votre liste? – Rohit

+0

Je n'affiche le webview que dans la méthode getVIew.référez-vous ci-dessus code plz j'ai collé –