0

FrameLayout を拡張するクラスを作成しました。

public class ReaderFrameLayout extends FrameLayout
{
    public ReaderFrameLayout(Context context)
    {
        this(context, null);
    }

    public ReaderFrameLayout(Context context, AttributeSet attrs)
    {
        this(context, attrs, 0);
    }

    public ReaderFrameLayout(Context context, AttributeSet attrs, int defaultStyle)
    {
        super(context, attrs, defaultStyle);
        WebView readerWebView = (WebView) findViewById(R.id.fragment_reader_webview);
        readerWebView.setOnTouchListener(new OnTouchListener()
        {
            @Override
            public boolean onTouch(View v, MotionEvent event)
            {
                Log.d("ReaderFrameLayout", "setOnTouchListener");
                return true;
            }
        });
    }
}

そしてそれをフラグメントに追加します。

<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" >

    <com.mbs.helpers.ReaderFrameLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:layout_marginTop="83dp" >

        <WebView
            android:id="@+id/fragment_reader_webview"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent" />

    </com.mbs.helpers.ReaderFrameLayout>

</RelativeLayout>

Eclipse のエラー:

com.android.layoutlib.bridge.MockView は android.view.ViewGroup にキャストできません 例外の詳細は [ウィンドウ] > [ビューの表示] > [エラー ログ] に記録されます 次のクラスをインスタンス化できませんでした: - com.mbs.helpers.ReaderFrameLayout (Open Class,エラー ログを表示) 詳細については、エラー ログ ([ウィンドウ] > [ビューの表示]) を参照してください。ヒント: カスタム ビューで View.isInEditMode() を使用して、Eclipse で表示されるときにコードをスキップします。

もちろん、アプリケーションは機能しません。

私は何を間違っていますか?

4

1 に答える 1

0

プログラムで Web ビューを作成するだけです。

public ReaderFrameLayout(Context context, AttributeSet attrs, int defaultStyle)
{
    super(context, attrs, defaultStyle);
    WebView readerWebView = new WebView(context);
    addView(readerWebView);
    readerWebView.setOnTouchListener(new OnTouchListener()
    {
        @Override
        public boolean onTouch(View v, MotionEvent event)
        {
            Log.d("ReaderFrameLayout", "setOnTouchListener");
            return true;
        }
    });
}

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" >

    <com.mbs.helpers.ReaderFrameLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:layout_marginTop="83dp" />

</RelativeLayout>

XML レイアウトからカスタム ビューを本当に作成したい場合は、それを別の XML ファイルで行い、それをカスタム クラスでインフレートする必要があります。

たとえば、次のres/layout/reader.xmlとおりです。

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

    <WebView
        android:id="@+id/fragment_reader_webview"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" />

</FrameLayout>

そしてあなたのコードで:

    public ReaderFrameLayout(Context context, AttributeSet attrs,
            int defaultStyle) {
        super(context, attrs, defaultStyle);
        LayoutInflater.from(context).inflate(R.layout.reader, this);
        WebView readerWebView = (WebView) findViewById(R.id.fragment_reader_webview);
        readerWebView.setOnTouchListener(new OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                Log.d("ReaderFrameLayout", "setOnTouchListener");
                return true;
            }
        });
    }
于 2012-11-27T10:41:30.860 に答える