如何以编程方式添加GestureOverlayView?

时间:2014-06-30 03:35:50

标签: java android xml relativelayout

这可能是一个非常新手的问题,但我无法以编程方式添加GestureOverlayView。我有一个基本的你好世界应用程序,我正在尝试与合并我的真实应用程序之前。坦率地说,我有点过头了,因为这将是我的第一个Android应用程序。

无论如何,与代码相处,我的fragment_main.xml看起来像这样:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:tools="http://schemas.android.com/tools"
 android:id="@+id/relative_layout"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:paddingBottom="@dimen/activity_vertical_margin"
 android:paddingLeft="@dimen/activity_horizontal_margin"
 android:paddingRight="@dimen/activity_horizontal_margin"
 android:paddingTop="@dimen/activity_vertical_margin"
 tools:context="pha.viz.gesturetest.MainActivity$PlaceholderFragment" >

 <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" />

</RelativeLayout>

现在我的MainActivity.java是:

public class MainActivity extends ActionBarActivity {
    private GestureLibrary mLibrary;
    RelativeLayout mRelativeLayout = (RelativeLayout) findViewById(R.id.relative_layout);

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.fragment_main);



        mLibrary = GestureLibraries.fromRawResource(this, R.raw.gestures);
        mLibrary.load();
        GestureOverlayView gestures = new GestureOverlayView(this);
        gestures.setGestureStrokeAngleThreshold(90.0f);
        gestures.addOnGesturePerformedListener(handleGestureListener);

        mRelativeLayout.addView(gestures);

        Display display = getWindowManager().getDefaultDisplay(); 

        LayoutParams params = gestures.getLayoutParams();
        params.width = display.getWidth() / 2;
        gestures.setLayoutParams(params);
        gestures.setTranslationX(0);
        }

    private OnGesturePerformedListener handleGestureListener = new
            OnGesturePerformedListener() {
        @Override
        public void onGesturePerformed(GestureOverlayView overlay, Gesture gesture) {
            ArrayList<Prediction> predictions = mLibrary.recognize(gesture);
            // one prediction needed
            if (predictions.size() > 0) {
                Prediction prediction = predictions.get(0);
                // checking prediction
                if (prediction.score > 1.0) {
                    // and action
                    Toast.makeText(getApplicationContext(), prediction.name,Toast.LENGTH_SHORT).show();
                }
            }       
        }
    };


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {

        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

    /**
     * A placeholder fragment containing a simple view.
     */
    public static class PlaceholderFragment extends Fragment {

        public PlaceholderFragment() {
        }

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
            View rootView = inflater.inflate(R.layout.fragment_main, container,
                    false);
            return rootView;
        }
    }

}

问题在于它正在崩溃。不可否认,我遵循与TextView相同的步骤,我认为它会起作用,所以我可能会遗漏一些非常明显的东西。

如果我手动将GestureOverlayView添加到fragment_main.xml并在MainActivity中引用它,我也知道代码有效,但是当我尝试更改它以在代码中创建“新”GestureOverlayView时并将其添加到我的RelativeLayout,它会崩溃。

感谢您阅读所有这些内容,感谢您给我的任何帮助或见解。

PS。我认为,为什么我要经历以编程方式而不是通过XML文件执行此操作的麻烦,您可能会感兴趣。原因是我试图快速识别大量手势。我发现另一个测试文件中有一个GestureOverlayView很慢,你会一次识别一个。然而,并排,他们将能够同时创建预测,给人一种“更快”的幻觉。通过一些工作,我希望在触摸时创建额外的GestureOverlayViews,并在命令完成后销毁它们。但是我甚至无法通过这个简单的测试来解决这个问题,即视图的创建。

1 个答案:

答案 0 :(得分:0)

看起来像NullPointerException。 A.B.C形式的行上的空指针异常意味着点左侧的某些内容为空。在您的情况下,这似乎出现在MainActivity的第28行。好像它无法通过id找到视图。要么你的身份证被误解了。请检查一下。