2016-10-17 12 views
1

バウンスオフquestionカスタムWebviewを使用して関数をオーバーライドする方法は?

私はFlingViewというジェスチャーイベントを組み込んだカスタムWebviewを作成しました。上のリンクされた質問の戦略は私にとってうまくいく。私の活動のレイアウトXMLは罰金です:

<?xml version="1.0" encoding="utf-8"?> 
<android.support.v4.widget.DrawerLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/drawer_layout_webview" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:openDrawer="start"> 

    <android.support.design.widget.CoordinatorLayout 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     xmlns:app="http://schemas.android.com/apk/res-auto" 
     xmlns:tools="http://schemas.android.com/tools" 
     android:id="@+id/coordinator_layout_webview" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     tools:context="net.brianclements.android.WebViewActivity"> 

     <net.brianclements.android.FlingView 
      android:id="@+id/webview" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:gravity="center" 
      android:keepScreenOn="true" /> 

    </android.support.design.widget.CoordinatorLayout> 

    <android.support.design.widget.NavigationView 
     android:id="@+id/nav_view_webview_left" 
     android:layout_width="wrap_content" 
     android:layout_height="match_parent" 
     android:layout_gravity="start" 
     app:headerLayout="@layout/nav_header_main" 
     app:menu="@menu/activity_webview_drawer_left" /> 

    <android.support.design.widget.NavigationView 
     android:id="@+id/nav_view_webview_right" 
     android:layout_width="wrap_content" 
     android:layout_height="match_parent" 
     android:layout_gravity="end" 
     app:headerLayout="@layout/nav_header_main" 
     app:menu="@menu/activity_webview_drawer_right" /> 

</android.support.v4.widget.DrawerLayout> 

のonCreate()この行います

setContentView(R.layout.activity_web_view); 

を、私は正常にロードするには、このメソッドを使用しました:

mWebview = (FlingView) findViewById(R.id.webview); 

さて、問題その内部の関数をオーバーライドしようとするときです:

mWebview = new FlingView(this, null) { 
     @Override 
     public void onLeftFling() { 
      Log.d(TAG, ACTIVITY_TAG + "onFling left: "); 
      someDynamicObject.thatCantBeUsedStatically(); 
     } 

     @Override 
     public void onRightFling() { 
      Log.d(TAG, ACTIVITY_TAG + "onFling right: "); 
      anotherDynamicObject.thatCantBeUsedStatically(); 
     } 
    }; 

それでは、mWebviewをレイアウトに挿入するにはどうすればよいですか?最初のキャスト方法はそれをとても簡単にしました。しかし私の研究から、インフルエンザのいくつかの組み合わせが含まれていると私は信じています。findViewById()addView()removeView()私はそれを理解していないようです。ここにどんなアイデア?あなたが作成したばかりの1で現在のFlingViewを交換したい場合は

答えて

1

View Sを、そしてあなたがすることはできませんインスタンス化の後にクラスメソッドをオーバーライドします。レイアウト定義されたViewを匿名インスタンス用に必要なオーバーライドで置き換えることはできますが、基本的にはレイアウトから作成されたインスタンスを破棄しているため、実際にはこれは最もクリーンな方法ではありません。

私は別のアプローチを提案します。あなたのFlingViewクラスにinterfaceを作成し、それらのアクションをActivityに返信してください。 OnClickListenerと非常によく似ています。例えば

:あなたのActivity

public class FlingView extends WebView { 

    public interface FlingListener { 
     void onLeftFling(); 
     void onRightFling(); 
    } 

    private FlingListener mListener; 

    public void setFlingListener(FlingListener listener) { 
     mListener = listener; 
    } 

    public void onLeftFling() { 
     if (mListener != null) { 
      mListener.onLeftFling(); 
     } 
    } 

    public void onRightFling() { 
     if (mListener != null) { 
      mListener.onRightFling(); 
     } 
    } 

    ... 
} 

は、膨張したレイアウトからあなたのFlingViewインスタンスを見つけた後、単にその上で、リスナーのインスタンスを設定します。

setContentView(R.layout.activity_web_view); 
... 

mWebview = (FlingView) findViewById(R.id.webview); 

mWebview.setFlingListener(new FlingView.FlingListener() { 
     @Override 
     public void onLeftFling() { 
      Log.d(TAG, ACTIVITY_TAG + "onFling left: "); 
      someDynamicObject.thatCantBeUsedStatically(); 
     } 

     @Override 
     public void onRightFling() { 
      Log.d(TAG, ACTIVITY_TAG + "onFling right: "); 
      anotherDynamicObject.thatCantBeUsedStatically(); 
     } 
    } 
); 
+1

これは優れています。リスナーを適切に実装する方法を教えてくれました。ありがとう! – brianclements

1

あなたは次の操作を行う必要があります。setContentView()呼び出しでインスタンス化されます。レイアウトで定義された

CoordinatorLayout cl = (CoordinatorLayout) findViewById(R.id.coordinator_layout_webview); 
cl.removeViewAt(0); // removing previous flingview 
cl.addView(mWebView, 0); // adding the new inflated one 
+0

私は右の私の 'mWebview'の作成後にこれらの3本のラインを入れて、私の側のナビゲーターパネルと下部のナビゲーションバーはまだ働いていたが、何のWebViewのコンテンツが見えなかったし、何のジェスチャーを拾っていないされていたすべての白の活動で残っていました。私はログからそれがバックグラウンドで確実にロードされているはずですが、それは見えませんでした。 – brianclements

+1

あなたが言うことに基づいて、私はこの問題はビューがロードされたwebviewが0の高さと0の幅を持っていると思われるので、そこにありますが、見ることはできません。読み込んだウェブビューの高さと幅をmatch_parentに設定してください。 –

+0

これは私の質問に答えました。 'mWebview.setLayoutParams(新しいLayoutParams(LayoutParams.MATCH_PARENT、LayoutParams.MATCH_PARENT));'を設定すると欠けていました。しかし、私は、より良い設計のソリューション全体として、他のアプローチを使用してしまいました。ありがとう、@マウロ。 – brianclements

関連する問題