【问题标题】:Maintaining proper Activity scope with Android使用 Android 维护适当的 Activity 范围
【发布时间】:2014-06-05 05:25:46
【问题描述】:

我在组织我的 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;
            }
        }

    }







}

【问题讨论】:

    标签: android android-listview android-gesture


    【解决方案1】:

    我认为,“正确”的方法是将对象声明放在需要它们的“最小”范围内。

    例如,在这种情况下,ListView 及其GestureDetector 都应该在Fragment 内。 Activity 不应该关心它们(例如,片段应该是可替换的——如果您将 Fragment 替换为另一个没有具有 ListView 的片段,为什么需要 GestureDetector)?

    OnSelectionMade 接口的实现者也是如此。

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

    【讨论】:

    • 您的措辞确实帮助我全面掌握了 Android 编程中的范围。很好的答案!
    猜你喜欢
    • 2021-11-18
    • 2016-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    相关资源
    最近更新 更多