Android自定义可重用控件?

时间:2014-05-14 12:55:06

标签: android android-layout android-controls

我在我正在编写的应用程序中有一些活动,我想在页面上放置一个表单。除了不同的标题和文本之外,它对于所有相同的活动都是相同的形式。

而不是重写每个活动的控件和逻辑,我正在寻找一种方法来创建我自己的控件,我可以使用我自己的属性放入我的布局xml文件,所以我需要做的就是写它一次,并在我需要的地方使用该控件。

我怎么能这样做?

由于

3 个答案:

答案 0 :(得分:0)

您可以使用扩展android.app.Activity的活动并将其定义为通用逻辑。然后,您的所有其他活动都将扩展它以代替扩展android.app.Activity。然后他们将继承它,你也可以覆盖你想要覆盖的内容。 如果你有完全相同的布局和一些差异,这个解决方案也不错,你可以只加载layout.xml一次,然后在子类中使用它。

SuperClass:

    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

答案 1 :(得分:0)

如何将控件编写为android片段?在xml中,您可以声明一个FrameLayout,然后使用FragmentTransaction的replace()方法将片段插入其中。

答案 2 :(得分:0)

取决于您在每个活动中的差异以及您如何访问它们。

如果它只是一些不同的字符串,那么将这些字符串放在Intent中,它会启动Activities并在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...

如果您的控制代码存在更多差异,并且您需要区分某种“表单类型A”,“表单类型B”等,您可以在您的意图中放置一个指示符并检查它是否有所不同代码中的决定。

所以,例如。

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()