3

ViewLabel3 つの を含むカスタム ビューでNutiteq を作成しようとしていますButton私のコードと問題は、この投稿のNutiteq: Button respと非常によく似ています。クリック可能なビューが Custom ViewLabel で機能しない

参照された投稿の提供された回答でonTouchEvent、ビューのメソッドが呼び出され、クリックを実行するオブジェクトがハンドラーによってコレオグラファーによってトリガーされるrunQueueに投稿されることに気付きました。

上記の内部呼び出しで aButtonを押した後、発生しますが、の-Method は、の外側のどこかを押すまで実行されません。次に、閉じます(その背後にあるマップを押すと、本来のように)、 - Method がトリガーされます。ViewLabelonClickButtonViewLabelViewLabelToastonClick

問題には何か関係があると思いますUIThreadperformClick-Action が間違った runQueue に入れられているようです。これは、ユーザーがLabel開いていないときにアクティブになります。

誰かがその問題を解決する方法を考えているといいですね。

編集: ViewLabel を作成する方法は次のとおりです。このメソッドは、MapActivity によって呼び出されるクラスにあります。

    public void createViewMarker(View markerView, Bitmap icon, MapPos pos, Category cat, String tag) {
    MarkerStyle markerStyle = MarkerStyle.builder().setBitmap(icon).setSize(0.5f).setColor(
            Color.WHITE).build();
    ViewLabel label = new ViewLabel(markerView, new Handler(Looper.getMainLooper()));
    label.setTouchHandlingMode(true);
    markers.add(new MocaMarker(pos, label, markerStyle, cat,
            markerLayer, tag));
}
4

3 に答える 3

3

解決策を持っていなかったGoogleグループのnutiteqチームの応答の後( ここを参照)、ViewLabelを完全に取り除くことにしました。

私の解決策は、準備された poi ビューのレイアウトを MapActivity レイアウト ファイルに含め、それを MapListener のカスタム実装と共にロードすることでした。私がMapListenerのコンストラクターで行ったpoiビュー要素のすべての初期化は、メソッドonVectorElementClickedが呼び出されたときに可視性を変更しました。基本的にどのように見えるかのスニペットを次に示します。

 @Override
public void onMapClicked(double x, double y, boolean b) {
    Toast.makeText(activity, "onMapClicked " + (new EPSG3857()).toWgs84(x, y).x + " " + (new EPSG3857()).toWgs84(x, y).y, Toast.LENGTH_SHORT).show();
    Log.d(TAG, "onMapClicked " + x + " " + y);
    activity.runOnUiThread(new Runnable() {
        @Override
        public void run() {
            mPoiGlanceView.setVisibility(View.INVISIBLE);
        }
    });
}

@Override
public void onVectorElementClicked(VectorElement vectorElement, double v, double v2, boolean b) {
    if (vectorElement != null && vectorElement instanceof Marker) {
        showPopupView(vectorElement);
        Toast.makeText(activity, "onLabelClicked Marker!", Toast.LENGTH_SHORT).show();
    }
}

private void showPopupView(VectorElement vectorElement) {
    mPoiGlanceView.setVisibility(View.VISIBLE);
    setUpUiElementsForView();
}

私は、nutiteq の github ドキュメントにある ViewLabel の代替案に触発されました。こちらの「Android 標準レイアウト ツールを使用する」を参照してください。

于 2015-06-11T08:20:48.587 に答える
1

Nutiteq SDK の ViewLabel コンストラクターは、Handler オブジェクトを引数として取ります。このハンドラーを使用して、ラベルの再描画とタッチ イベント メッセージを送信します。まず、ハンドラーが UI スレッドに正しく接続されているかどうかを確認します。これに関する追加情報がここにあります: https://developer.android.com/training/multiple-threads/communicate-ui.html

于 2015-03-16T08:24:07.887 に答える
1

カスタム ビューを引き続き使用したい人のために、私が見つけた回避策を次に示します。カスタム ビューでトリガーされたイベントは、イベントの後に実行されることがわかりましたonMapMoved。したがって、手動でトリガーします。コードは次のとおりです。

YourViewIDカスタム ビュー レイアウト ID とYourButtonIDボタン ID に置き換えます。ViewLabel を作成する場所に以下のコードを追加します

View v = getLayoutInflater().inflate(R.layout.YourViewID, null);
((Button)v.findViewById(R.id.YourButtonID)).setOnTouchListener(new View.OnTouchListener(){
    @Override
    public boolean onTouch(View view, MotionEvent motionEvent) {
        //Trigger only when users release the button
        if(motionEvent.getActionMasked()==MotionEvent.ACTION_UP){
            //Do your work
        }
        //Do not consume the OnTouch event
        return false;
    }
});

YourBaseLayoutIDルート レイアウト ID とyourMapViewMapView オブジェクトに置き換えます。以下のコードを に追加しますOnCreate()

findViewById(R.id.YourBaseLayoutID).setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View view, MotionEvent motionEvent) {
        if(motionEvent.getActionMasked()==MotionEvent.ACTION_UP)
            yourMapView.getOptions().getMapListener().onMapMoved();
        return false;
    }
});
于 2015-06-29T03:08:20.890 に答える