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

Java 在Android中调用MainActivity之外的UI函数,java,android,android-layout,Java,Android,Android Layout,我已经在MainActivity.java中编写了UI函数(如下所示)。现在,由于设计问题,我的要求是将这些函数与MainActivity.java分离,并写入其他文件,然后这些函数将与UI元素交互。如何将UI函数与MainActivity.java分开 public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) {

我已经在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>

当您声明按钮的onClick是布局xml的一部分时,很难从活动类范围中分离出来

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

现在,如果您想将此逻辑作为设计模式问题分离出来,而不是从xml布局文件中删除
onClick
,将自定义onClick侦听器创建为不同的java类并重写该类中的onClick,在活动的
onCreate()
中定义按钮,并将自定义onClick侦听器设置为这些按钮

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

现在,在你的活动中

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));
    }

您可以首先从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() { }
}

创建另一个类并从
onClick()
s调用这些函数?你的问题很广泛,谢谢你的指点!对我来说,按钮的onClick作为布局xml文件的一部分不是强制性的。我可以更改我的activity_main.xml文件。请您提供一个更清晰的代码建议好吗?这个解决方案现在可以工作了。非常感谢您的时间和努力!
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() { }
}