来自另一个 class 的多个活动的 setContentView
setContentView of multiple activities from a another class
我正在创建一个 android 应用程序,它需要能够在另一个全局 class 中以几种方法在多个 android 活动布局上设置内容视图。因此,当我从新的 activity onCreate 调用该方法时,按钮和文本视图将由 findviewbyId 通过先前定义的 class 中的方法分配。示例代码如下所示。
public void executeWorkItem() {
setContentView(R.layout.activity_message);
Button button = (Button) findViewById(R.id.btnSendSMS);
button.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v) {
EditText textPhone = (EditText) findViewById(R.id.phoneNum);
EditText textSms = (EditText) findViewById(R.id.smsContent);
final String phoneNumber = textPhone.getText().toString();
final String message = textSms.getText().toString();
Map<String, Object> results = new HashMap<String, Object>();
results.put("phoneNmbr", "" + phoneNumber);
results.put("message", "" + message);
}
});
}
因此,当我从 activity 调用此方法时,如下所示,应该执行该方法而不会出现空错误。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
app = (MyApplication)getApplication();
// Call a custom application method
app.executeWorkItem();
}
因此我应该为此创建一个应用程序 class 还是必须创建一个扩展 Activity 的对象并在其中调用该对象方法?
注意:我应该能够创建可以做类似事情的不同方法。
不确定我是否完全正确地回答了您的问题,但也许您应该为您的活动创建基础 class,将所有公共侦听器和其他内容连接到其 onCreate()
。您的布局应该包含基础 class 期望找到的所有按钮(很可能您可能想使用 <include>
或 <merge>
(see docs)。或者您可以考虑使用 Fragments
但这可能需要您做更多的工作。
PS:我不知道 app.executeWorkItem();
在做什么,但你确定应用程序 class 是正确的地方吗?
编辑
I am not sure about that. I want to handle multiple layouts of multiple activities from single class / activity
这只是您如何传递要使用的layoutId 的问题。您可以使用 abstract int getLayoutId())
之类的方法使基础 class 抽象化,然后您的基础 onCreate()
只需要执行 setContentView(getLayoutId());
或者您可以删除基础的 onCreate()
并覆盖setContentView())
并在那里布线(但我真的不喜欢那样)。
非常容易做到。您所需要的只是一个像 BaseActivity 这样的 Parent Activity,然后所有其他活动都简单地扩展该 Parent Activity,如下所示:
public class BaseActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_message);
Button button = (Button) findViewById(R.id.btnSendSMS);
button.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v) {
EditText textPhone = (EditText) findViewById(R.id.phoneNum);
EditText textSms = (EditText) findViewById(R.id.smsContent);
final String phoneNumber = textPhone.getText().toString();
final String message = textSms.getText().toString();
Map<String, Object> results = new HashMap<String, Object>();
results.put("phoneNmbr", "" + phoneNumber);
results.put("message", "" + message);
}
});
}
}
然后您的所有其他活动都会像这样扩展父 Activity:
public class MainActivity extends BaseActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//Do not call setContentView again
}
}
public class SecondActivity extends BaseActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//Do not call setContentView again
}
}
如果您注意到 super.onCreate(savedInstanceState)
它只是调用其父级 class 的 onCreate 方法,在本例中为 BaseActivity(后者又调用 Activity class).
我正在创建一个 android 应用程序,它需要能够在另一个全局 class 中以几种方法在多个 android 活动布局上设置内容视图。因此,当我从新的 activity onCreate 调用该方法时,按钮和文本视图将由 findviewbyId 通过先前定义的 class 中的方法分配。示例代码如下所示。
public void executeWorkItem() {
setContentView(R.layout.activity_message);
Button button = (Button) findViewById(R.id.btnSendSMS);
button.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v) {
EditText textPhone = (EditText) findViewById(R.id.phoneNum);
EditText textSms = (EditText) findViewById(R.id.smsContent);
final String phoneNumber = textPhone.getText().toString();
final String message = textSms.getText().toString();
Map<String, Object> results = new HashMap<String, Object>();
results.put("phoneNmbr", "" + phoneNumber);
results.put("message", "" + message);
}
});
}
因此,当我从 activity 调用此方法时,如下所示,应该执行该方法而不会出现空错误。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
app = (MyApplication)getApplication();
// Call a custom application method
app.executeWorkItem();
}
因此我应该为此创建一个应用程序 class 还是必须创建一个扩展 Activity 的对象并在其中调用该对象方法? 注意:我应该能够创建可以做类似事情的不同方法。
不确定我是否完全正确地回答了您的问题,但也许您应该为您的活动创建基础 class,将所有公共侦听器和其他内容连接到其 onCreate()
。您的布局应该包含基础 class 期望找到的所有按钮(很可能您可能想使用 <include>
或 <merge>
(see docs)。或者您可以考虑使用 Fragments
但这可能需要您做更多的工作。
PS:我不知道 app.executeWorkItem();
在做什么,但你确定应用程序 class 是正确的地方吗?
编辑
I am not sure about that. I want to handle multiple layouts of multiple activities from single class / activity
这只是您如何传递要使用的layoutId 的问题。您可以使用 abstract int getLayoutId())
之类的方法使基础 class 抽象化,然后您的基础 onCreate()
只需要执行 setContentView(getLayoutId());
或者您可以删除基础的 onCreate()
并覆盖setContentView())
并在那里布线(但我真的不喜欢那样)。
非常容易做到。您所需要的只是一个像 BaseActivity 这样的 Parent Activity,然后所有其他活动都简单地扩展该 Parent Activity,如下所示:
public class BaseActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_message);
Button button = (Button) findViewById(R.id.btnSendSMS);
button.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v) {
EditText textPhone = (EditText) findViewById(R.id.phoneNum);
EditText textSms = (EditText) findViewById(R.id.smsContent);
final String phoneNumber = textPhone.getText().toString();
final String message = textSms.getText().toString();
Map<String, Object> results = new HashMap<String, Object>();
results.put("phoneNmbr", "" + phoneNumber);
results.put("message", "" + message);
}
});
}
}
然后您的所有其他活动都会像这样扩展父 Activity:
public class MainActivity extends BaseActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//Do not call setContentView again
}
}
public class SecondActivity extends BaseActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//Do not call setContentView again
}
}
如果您注意到 super.onCreate(savedInstanceState)
它只是调用其父级 class 的 onCreate 方法,在本例中为 BaseActivity(后者又调用 Activity class).