Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/214.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Android维护适当的活动范围_Android_Android Listview_Android Gesture - Fatal编程技术网

使用Android维护适当的活动范围

使用Android维护适当的活动范围,android,android-listview,android-gesture,Android,Android Listview,Android Gesture,我在组织Java类时遇到了一些问题,因此我需要在任何给定对象中访问的所有内容的范围都是可用的 例如,我有一个MainActivity,它有一个ListView,我希望将onFling手势侦听器附加到该ListView,以便在将ListView项目从屏幕上删除时将其删除。但是,我无法确定如何设置侦听器,以便侦听器可以访问我的ArrayAdapter和ListView,也可以通过MainActivity对其进行实例化onCreate() 正确的设置方法是什么 public class MainAct

我在组织Java类时遇到了一些问题,因此我需要在任何给定对象中访问的所有内容的范围都是可用的

例如,我有一个MainActivity,它有一个ListView,我希望将onFling手势侦听器附加到该ListView,以便在将ListView项目从屏幕上删除时将其删除。但是,我无法确定如何设置侦听器,以便侦听器可以访问我的ArrayAdapter和ListView,也可以通过MainActivity对其进行实例化onCreate()

正确的设置方法是什么

public class MainActivity extends FragmentActivity implements onSelectionMade {
    public final static String EXTRA_MESSAGE = "com.example.myfirstapp.MESSAGE";
    private static View current;
    private GestureDetectorCompat mDetector;

    @Override
    public void doChange(int val){
        if(val == onSelectionMade.OK){
            // Add contact
            current.setBackgroundColor(Color.rgb(60, 242, 102));

        }else if(val == onSelectionMade.CANCEL){
            current.setBackgroundColor(Color.rgb(237, 47, 47));
        }
    }

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

            // THIS IS THE LINE WITH THE ERROR BECAUSE MyGestureListener IS NOT IN THE                         SCOPE OF THE MAIN ACTIVITY
        this.mDetector = new GestureDetectorCompat(this, new MyGestureListener());


        if (savedInstanceState == null) {
            getSupportFragmentManager().beginTransaction()
                    .add(R.id.container, new PlaceholderFragment())
                    .commit();
        }
    }


    @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 {

        ContactAdapter adapter;
        ListView view;

        public PlaceholderFragment() {
        }

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

            Contact contactList[] = new Contact[] 
            {
                    new Contact("Matt", "Hintzke", "2062259311", "matt.hintzke@email.wsu.edu"),
                    new Contact("John", "Smith", "2062236457", "john@email.com"),
                    new Contact("Bob", "Harrison", "2064318756", "bob@email.com"),
                    new Contact("Colleen", "Arnold", "2065553696", "ween@email.com"),
                    new Contact("Harry", "Larkin", "3608785423", "poop@gmail.com")
            };

            adapter = new ContactAdapter(getActivity(), R.layout.contact_item , contactList);   

            view = (ListView) rootView.findViewById(R.id.listView);
            view.setAdapter(adapter);

            view.setOnItemClickListener(new OnItemClickListener(){
                public void onItemClick(AdapterView<?> parentAdapter, View view, int position, long id){

                    Contact item = (Contact) parentAdapter.getItemAtPosition(position);
                    current = view;
                    //adapter.remove(adapter.getItem(position));

                    DialogFragment dialog = AddContactDialog.newInstance(item);

                    dialog.show(getActivity().getSupportFragmentManager(), "Add Contact Dialog");
                    //Toast.makeText(getActivity().getApplicationContext(), item.first, Toast.LENGTH_SHORT).show();

                }
            });


            return rootView;
        }


        class MyGestureListener extends GestureDetector.SimpleOnGestureListener {
            private static final String DEBUG_TAG = "Gestures"; 


            @Override
            public boolean onFling(MotionEvent event1, MotionEvent event2, 
                    float velocityX, float velocityY) {
                if(event2.getX() - event1.getX() > 10){
                    int id = view.pointToPosition((int) event1.getX(), (int) event1.getY());
                    adapter.remove(adapter.getItem(id));
                }
                return true;
            }
        }

    }







}
public类MainActivity扩展FragmentActivity实现onSelectionMake{
公共最终静态字符串EXTRA_MESSAGE=“com.example.myfirstapp.MESSAGE”;
私有静态视图电流;
私人手势检测器;
@凌驾
公共无效数据更改(int val){
如果(val==onselectionmake.OK){
//添加联系人
当前.setBackgroundColor(Color.rgb(60242,102));
}else if(val==onselectionmake.CANCEL){
当前.setBackgroundColor(Color.rgb(237,47,47));
}
}
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//这是出现错误的行,因为MyGestureListener不在主活动的范围内
this.mDetector=new GestureDetectorCompat(this,new MyGestureListener());
如果(savedInstanceState==null){
getSupportFragmentManager().beginTransaction()
.add(R.id.container,新的占位符片段())
.commit();
}
}
@凌驾
公共布尔onCreateOptions菜单(菜单){
//为菜单充气;这会将项目添加到操作栏(如果存在)。
getMenuInflater().充气(R.menu.main,menu);
返回true;
}
@凌驾
公共布尔值onOptionsItemSelected(菜单项项){
//处理操作栏项目单击此处。操作栏将
//自动处理Home/Up按钮上的点击,只要
//在AndroidManifest.xml中指定父活动时。
int id=item.getItemId();
if(id==R.id.action\u设置){
返回true;
}
返回super.onOptionsItemSelected(项目);
}
/**
*包含简单视图的占位符片段。
*/
公共静态类占位符片段扩展了片段{
接触适配器;
列表视图;
公共占位符片段(){
}
@凌驾
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState){
视图根视图=充气机。充气(R.layout.fragment_main,容器,错误);
联系人列表[]=新联系人[]
{
新联系人(“Matt”、“Hintzke”、“2062259311”、“Matt。hintzke@email.wsu.edu"),
新联系人(“约翰”、“史密斯”、“2062236457”、”john@email.com"),
新联系人(“鲍勃”、“哈里森”、“2064318756”bob@email.com"),
新联系人(“科琳”,“阿诺德”,“2065553696”ween@email.com"),
新联系人(“哈里”,“拉金”,“3608785423”poop@gmail.com")
};
适配器=新的ContactAdapter(getActivity(),R.layout.contact_项,contactList);
view=(ListView)rootView.findViewById(R.id.ListView);
view.setAdapter(适配器);
view.setOnItemClickListener(新的OnItemClickListener(){
public void onItemClick(适配器视图父适配器、视图视图、整型位置、长id){
联系人项目=(联系人)parentAdapter.getItemAtPosition(位置);
当前=视图;
//移除(adapter.getItem(位置));
DialogFragment dialog=AddContactDialog.newInstance(项);
显示(getActivity().getSupportFragmentManager(),“添加联系人对话框”);
//Toast.makeText(getActivity().getApplicationContext(),item.first,Toast.LENGTH_SHORT).show();
}
});
返回rootView;
}
类MyGestureListener扩展了GestureDetector.SimpleOnGestureListener{
私有静态最终字符串调试_TAG=“手势”;
@凌驾
公共布尔onFling(MotionEvent1、MotionEvent2、,
浮动速度x,浮动速度y){
if(event2.getX()-event1.getX()>10){
int id=view.pointToPosition((int)event1.getX(),(int)event1.getY());
adapter.remove(adapter.getItem(id));
}
返回true;
}
}
}
}
我认为,“正确”的方法是将对象声明放在需要它们的“最小”范围内

例如,在这种情况下,
列表视图
及其
手势检测器
都应该位于
片段
内。活动不应该关心它们(例如,片段应该是可替换的——如果您将片段替换为另一个没有ListView的片段,为什么需要GestureDetector)

这同样适用于
OnSelectionMade
接口&c的实现者


此外,片段不需要是活动的内部类。我不确定IDE为什么会这样创建它们,这会导致混乱://

您的措辞确实帮助我全面掌握了Android编程中的范围。回答得好!