Android可重用视图和OnClickListener

时间:2014-06-24 10:03:54

标签: include onclicklistener

我正在尝试实现可重用的视图并创建一个适用于所有类的OnClickListener。我的代码如下:

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

        LinearLayout layout = (LinearLayout)findViewById(R.id.layout1);

        Button button = (Button) findViewById(R.id.layout1).findViewById(R.id.button1);
        Button button2 = (Button) findViewById(R.id.layout1).findViewById(R.id.button2);
        Button button3 = (Button) findViewById(R.id.layout1).findViewById(R.id.button3);        

        applyListener(layout,listener);
        applyListener(layout,listener);
        applyListener(layout,listener);

    }

    OnClickListener listener = new OnClickListener() {

        public void onClick(View view) {    
            switch (view.getId()){

            case R.id.button1:
                     Toast.makeText(getApplicationContext(), "ONE",Toast.LENGTH_LONG).show();
                     Intent intent = new Intent(MainActivity.this, P2.class);
                     startActivity(intent);
                break;
            case R.id.button2:  
                     Toast.makeText(getApplicationContext(), "TWO",Toast.LENGTH_LONG).show();
                     Intent intent2 = new Intent(MainActivity.this, P3.class);
                     startActivity(intent2);
                 break; 
            case R.id.button3:  
                    Toast.makeText(getApplicationContext(), "THREE",Toast.LENGTH_LONG).show();
                    Intent intent3 = new Intent(MainActivity.this, P4.class);
                 startActivity(intent3);
             break; 
                 }  
            }

        private Context getContext() {
            // TODO Auto-generated method stub
            return null;
        }

     }; 





        private static void applyListener(View child, OnClickListener listener) {
            if (child == null)
                return;

            if (child instanceof ViewGroup) {
                applyListener((ViewGroup) child, listener);
            }
            else if (child != null) {
                if(child.getId() == R.id.button1) {
                    child.setOnClickListener(listener);
                }     
                if(child.getId() == R.id.button2) {
                    child.setOnClickListener(listener);
                }
                if(child.getId() == R.id.button3) {
                    child.setOnClickListener(listener);
                }



            }
        }

        private static void applyListener(ViewGroup parent, OnClickListener listener) {
            for (int i = 0; i < parent.getChildCount(); i++) {
                View child = parent.getChildAt(i);
                if (child instanceof ViewGroup) {
                    applyListener((ViewGroup) child, listener);
                } else {
                    applyListener(child, listener);
                }
            }
        }


}

问题是,一旦它移出MainActivty,它会在我按下任何按钮后立即崩溃。我确信这与该行有关:

Intent intent = new Intent(MainActivity.this, P2.class);

我认为这个问题与它正在引用一个非活动的类这一事实有关,例如MainActivity.this。我尝试用以下方法替换MainActivity.this:

this

getContext()

getBaseContext()

但它们不起作用。

我也试过

Intent intent = new Intent("com.example.APANEL.P2.class"); 

但这也不起作用。

我确信applyListener方法正在正确实现,因为按钮都是子项,因此正在使用该方法实现:

private static void applyListener(ViewGroup parent, OnClickListener listener)

我已经阅读了android文档和我能找到的每篇文章,但我似乎无法找到可行的解决方案。

任何帮助都会有很大帮助

1 个答案:

答案 0 :(得分:0)

我通过以下方式解决了这个问题:

在MainActivity类中,我创建了方法:

public void setup(){

    LinearLayout layout = (LinearLayout)findViewById(R.id.layout1);

        Button button = (Button) findViewById(R.id.layout1).findViewById(R.id.button1);
        Button button2 = (Button) findViewById(R.id.layout1).findViewById(R.id.button2);
        Button button3 = (Button) findViewById(R.id.layout1).findViewById(R.id.button3);                            
        applyListener(layout,listener);

    }

然后,重新使用视图的所有类(例如显示按钮面板)必须扩展MainActivity,并且在onCreate()方法中,它们实现方法setup()

总而言之,它与Intent无关,而是与后续类中没有设置侦听器这一事实有关。