【问题标题】:Android custom reusable controls?Android自定义可重用控件?
【发布时间】:2014-05-14 12:55:05
【问题描述】:

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

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

我怎么能做这样的事?

谢谢

【问题讨论】:

    标签: android android-layout android-controls


    【解决方案1】:

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

    【讨论】:

    【解决方案2】:

    您可以使用扩展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

    【讨论】:

    • 但是屏幕上的控件呢?像文本框和按钮?我需要它作为控件,因此我也可以将它放置在每个使用它的活动上我想要的位置。
    • 我更新了我的答案,试图提供更多帮助,并回答你的最后一个问题。
    【解决方案3】:

    取决于您在每个 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()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-18
      • 2012-06-20
      • 2023-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多