【问题标题】:setContentView of multiple activities from a another class来自另一个类的多个活动的 setContentView
【发布时间】:2015-08-06 02:45:46
【问题描述】:

我正在创建一个 android 应用程序,它需要能够在另一个全局类中的几个方法中在多个 android 活动布局上设置内容视图。因此,当我从新活动 onCreate 调用该方法时,按钮和文本视图由 findviewbyId 通过先前定义的类中的方法分配。示例代码如下所示。

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

因此,当我从如下所示的活动中调用此方法时,应该执行该方法而不会出现空错误。

  @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    app = (MyApplication)getApplication();

     // Call a custom application method
    app.executeWorkItem();
} 

因此,我应该为此创建一个应用程序类,还是必须创建一个扩展 Activity 的对象并在其中调用该对象方法? 注意:我应该能够创建可以做类似事情的不同方法。

【问题讨论】:

  • 为什么你对一堆活动使用相同的布局和视图?

标签: java android findviewbyid


【解决方案1】:

很容易做到。您只需要一个像 BaseActivity 这样的父 Activity,然后所有其他 Activity 都简单地扩展该父 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);
            }
        });
    }
}

然后您的所有其他活动都像这样扩展父活动:

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) 它只是调用它的父类的 onCreate 方法,在本例中是 BaseActivity(它又调用 Activity 类)。

【讨论】:

    【解决方案2】:

    不确定我是否完全正确地回答了您的问题,但也许您应该为您的活动创建基类,以便在其onCreate() 上连接所有常见的侦听器和其他东西。您的布局应包含基类期望找到的所有按钮(很可能您可能想要使用&lt;include&gt;&lt;merge&gt; (see docs)。或者您可以考虑使用Fragments,但这可能对您来说需要更多的工作做。

    PS:我不知道app.executeWorkItem(); 在做什么,但你确定应用程序类是适合它的地方吗?

    编辑

    我不确定。我想处理来自单个类/活动的多个活动的多个布局

    这只是你如何传递要使用的 layoutId 的问题。您可以使用abstract int getLayoutId()) 之类的方法将基类抽象化,然后您的基类onCreate() 只需要执行setContentView(getLayoutId()); 或者您可以删除基类的onCreate() 而是覆盖setContentView()) 并在那里进行接线(但我这样做真的不是那样)。

    【讨论】:

    • 我不确定。我想处理来自单个类/活动的多个活动的多个布局
    • 查看编辑后的答案。接受的答案使每个活动都使用相同的布局,那么拥有不同活动的意义何在?
    猜你喜欢
    • 1970-01-01
    • 2014-12-21
    • 2020-03-19
    • 1970-01-01
    • 1970-01-01
    • 2016-02-09
    • 2014-01-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多