在Android中调用MainActivity之外的UI函数

时间:2015-10-22 16:09:39

标签: java android android-layout

我在MainActivity.java中编写了UI函数(如下所示)。现在,由于设计问题,我的要求是将这些函数与MainActivity.java分开并写入其他文件,然后这些函数将与UI元素交互。如何将UI功能与MainActivity.java分开。

public class MainActivity extends Activity {

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

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }   

    // There is "Off" button On UI. Onclick event of the button, this function
    // is called. 
    public void OffCommandInterface(View view) {

    }

    // There is "SetTemp" button On UI. Onclick event of the button, 
    //this function reads data from textbox and send data to other module.
    public void SetTempCommandInterface(View view) {

    }

    // There is "SetTemp" button On UI. Onclick event of the button, 
    //this function reads data from textbox and send data to other module.  
    public void profileRequestInterface(View view){         

    }
}

我附加了activity_main.xml文件以供参考。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >    

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal" >          

        <Button
            android:id="@+id/button"
            android:layout_width="wrap_content"
            android:layout_height="72dp"
            android:onClick="profileRequestInterface"
            android:text="@string/button_send" />

    </LinearLayout>

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:text="Switch Off Heater"
        android:onClick="OffCommandInterface" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal" >

        <EditText
            android:id="@+id/edit_temp"
            android:layout_width="136dp"
            android:layout_height="wrap_content" >
        </EditText>

        <Button
            android:id="@+id/temp"
            android:layout_width="wrap_content"
            android:layout_height="72dp"
            android:onClick="SetTempCommandInterface"
            android:text="SetTemp" />
    </LinearLayout>   

</LinearLayout>

2 个答案:

答案 0 :(得分:1)

当您将Button的onClick声明为布局xml的一部分时,很难从Activity类范围中分离出来。

当您将视图的onClick声明为布局xml时,它将附加在该布局上调用setContentView()的活动。因此,您必须在Activity本身中定义所有Button的点击方法。

现在,如果您想将此逻辑分离为设计模式问题,而不是从xml布局文件中删除onClick,请将自定义onClick侦听器创建为不同的java类,并覆盖该类中的onClick,定义您的按钮&#39;在onCreate()的Activity中,并将自定义onClick侦听器设置为这些按钮。

示例:(这只是一个示例,您可以使用代码和用例进行更改)

public class CustomOnClickListener implements View.OnClickListener{

 private Context appContext;
 public CustomOnClickListener(Context context)
 {
    appContext = context;
 }

 @Override
 public void onClick(View arg0) {
   switch(arg0.getId())
   {
    case R.id.button1:
    // There is "Off" button On UI. Onclick event of the button, this function
    // is called. 
    break;
   }

  }
}

现在,在您的活动中,

public class MainActivity extends Activity {
    Button buttonOff;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        buttonOff = (Button)findViewById(R.id.button1);
        buttonOff.setOnClickListener(new CustomOnClickListener(this));
    }

答案 1 :(得分:1)

您可以先从XML中删除android:onClick并在代码中处理它。除了用于学习目的,我从未理解这种做法。这应该让你开始。

public class MainActivity extends Activity implements View.OnClickListener {

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

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }   

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.button1:
                this.OffCommandInterface();
                break;
            default:
                break;
    }

    private void OffCommandInterface() { }
    private void SetTempCommandInterface() { }
    private void profileRequestInterface() { }
}