【发布时间】:2014-05-14 12:55:05
【问题描述】:
我正在编写的应用中有一些活动,我想在页面上放置一个表单。除了标题和文本不同之外,所有活动的形式都相同。
我不是为每个活动重写控件和逻辑,而是在寻找一种方法来创建我自己的控件,我可以将它放在我的布局 xml 文件中,并使用我自己的属性,所以我需要做的就是编写它一次,然后在需要的地方使用该控件。
我怎么能做这样的事?
谢谢
【问题讨论】:
标签: android android-layout android-controls
我正在编写的应用中有一些活动,我想在页面上放置一个表单。除了标题和文本不同之外,所有活动的形式都相同。
我不是为每个活动重写控件和逻辑,而是在寻找一种方法来创建我自己的控件,我可以将它放在我的布局 xml 文件中,并使用我自己的属性,所以我需要做的就是编写它一次,然后在需要的地方使用该控件。
我怎么能做这样的事?
谢谢
【问题讨论】:
标签: android android-layout android-controls
将控件编写为 android Fragment 怎么样?在 xml 中,您可以声明一个 FrameLayout,然后使用 FragmentTransaction 的 replace() 方法将片段插入其中。
【讨论】:
您可以使用扩展android.app.Activity 的活动并将其定义为通用逻辑。然后您的所有其他活动将扩展它以代替扩展android.app.Activity。然后他们将继承它,您也可以覆盖您想要覆盖的内容。
如果你的布局完全相同,只是有一些差异,这个解决方案还不错,你可以只加载一次layout.xml,然后在子类中随意使用它。
超类:
public SuperClass extends Activity{
protected TextView myTextView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.my_layout);
myTextView = (TextView) findViewById(R.id.my_text_view);
}
}
ChildClassA:
public ChildClassA extends SuperClass {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.my_layout);
myTextView.setText("I am in A");
}
}
ChildClassB:
public ChildClassB extends SuperClass {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.my_layout);
myTextView.setText("I am in B");
}
}
其他建议: 另一个想法是创建一个custom view。也看到这个tutorial。
【讨论】:
取决于您在每个 Activity 中的差异以及您访问它们的方式。
如果只是一些不同的字符串,请将这些字符串放在 Intent 中,Intent 会启动活动并在 onCreate() 中获取它们。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.lyt_template_form);
((TextView) findViewById(R.id.txt_form_headline)).setText(getIntent().getStringExtra("headline");
((TextView) findViewById(R.id.txt_form_subtitle1)).setText(getIntent().getStringExtra("subtitle1");
//etc...
如果你的控件代码有更多的差异,你需要区分某种“Form Type A”,“Form Type B”等,你可以在你的Intent中放置一个指示器并检查它以做出不同代码中的决定。
例如
if (getArguments().getInt("Type") == 0) {
// do stuff in control like this
} else if (getArguments().getInt("Type") == 1) {
// do stuff in control like this
// etc.
getArgument() 等价于getIntent().getXyzExtra()
【讨论】: