【问题标题】:"Header" Views and buttons: how do I attach listeners to Buttons in a "header" that does not have its own Activity?“标题”视图和按钮:如何将侦听器附加到没有自己活动的“标题”中的按钮?
【发布时间】:2010-01-06 15:13:47
【问题描述】:

我已经触及了这个问题here,Christopher 对此给出了答案,但我并不真正理解它,所以我认为是时候让它成为一个真正的问题,而不仅仅是一个“跟进”= )


就目前而言,我正在编写的应用程序有 4 个不同的屏幕:

  1. 屏幕 1 - 节点列表(主屏幕)
  2. 屏幕 2 - 选项菜单,带按钮的 tableLayout
  3. 屏幕 3 - 导航
  4. 屏幕 4 - 版本等文本详细信息

可以使用放置在顶部的“标题”视图导航到/从这些屏幕导航。然后标题有 4 个不同的按钮:

+--------------------+
| menu with buttons  |
+--------------------+
|                    |
|                    |
|                    |
|  C O N T E N T     |
|                    |
|                    |
|                    |
+--------------------+

标题只是一个带有几个按钮的 XML 文件 (header.xml)。该 header.xml 使用包含标记包含在布局中。例如,main.xml 有一行:

<include layout="@layout/header"></include>

标题显示正常,但问题是 - 为标题中的按钮附加 OnClickListeners 的正确方法是什么?

Christopher pointed out,您可以创建一个 Activity 类并在那里执行挂钩,如下所示:

public class BaseActivity extends Activity {
    protected View.OnClickListener mButtonListener;

    protected void setupHeaderButtons() {
        findViewById(R.id.header_btn_1).setOnClickListener(mButtonListener);
        // ...
        findViewById(R.id.header_btn_n).setOnClickListener(mButtonListener);
    }
}

public class FirstActivity extends BaseActivity {
    @Override
    public void onCreate(Bundle b) {
        super.onCreate(b);
        setContentView(R.layout.first_activity);

        // This needs to be done *after* the View has been inflated
        setupHeaderButtons();
    }
}

首先,我无法使其工作,因为方法 setupHeaderButtons 无法从 FirstActivity 访问。其次,这是正确的做法吗?

【问题讨论】:

    标签: java android


    【解决方案1】:

    setupHeaderButtons() 方法是 protected,因此它只能被 extend 该基类的类访问,在本例中为 BaseActivity

    您确定您的FirstActivity 正在扩展BaseActivity

    【讨论】:

    • +1 - 如果 setupHeaderButtons() 不可访问,我敢打赌它被意外声明为私有。
    • 谢谢你 =) 我的错,忘了扩展 BaseActivity,呵呵。但是对于我上面的静态“顶级菜单”/标题内容,这是正确的方法吗?我的意思是整个想法,与 和所有?
    • 所以:对于我创建的每个顶部应该有标题的活动,我需要让 MyActivity 扩展 BaseActivity 并运行 setupHeaderButtons()。似乎有点像“丑陋的黑客”……我错了吗? -------------------------------------------------- ------------- 另外,每次单击按钮切换屏幕时,都会执行“startActivity(...)”。它是否知道不再创建 Activity,而只是切换到它(因为它通常已经创建)??
    • 可能。做事总是有不止一种方法(正如 dtmilano 在他们的回答中显示的那样)。每次 Activity 进入视野时,无论是通过 Intent 被触发,还是您从上一个屏幕返回,它都会经历活动生命周期的相关部分。所以总是会调用 onResume(),也许还会调用onStart() 在此之前。您需要注意的是,由于内存需求等原因,Android 可以随时杀死任何东西。
    • Hi =) OnClick 侦听器在按下时调用“startActivity”,这意味着每次单击标题按钮之一时都会执行 onCreate。感觉完全不对……你说什么?
    【解决方案2】:

    我更喜欢这样,这样您就不必记住(并且可能忘记)为每个派生的 Activity 调用 setupHeaderButtons。顺便说一句,设置UpHeaderButtons 这是一个更好的名字。

    public class BaseActivity extends Activity {
        protected View.OnClickListener mButtonListener;
    
    @Override
    public void setContentView(int layoutResID) {
        super.setContentView(layoutResID);
                setupHeaderButtons();
        }
    
        protected void setupHeaderButtons() {
            findViewById(R.id.header_btn_1).setOnClickListener(mButtonListener);
            // ...
            findViewById(R.id.header_btn_n).setOnClickListener(mButtonListener);
        }
    }
    
    public class FirstActivity extends BaseActivity {
        @Override
        public void onCreate(Bundle b) {
            super.onCreate(b);
            setContentView(R.layout.first_activity);
        }
    }
    

    【讨论】:

    • 很好的覆盖setContentView,方法名称中的语法非常正确!
    【解决方案3】:

    我个人认为你不应该把事情复杂化。必须调用 setupHeaderButtons 应该没问题,尤其是当您只有少数活动时。

    如果您使用标准启动模式,活动将重新启动。如果您有兴趣了解启动模式,请查看Application Fundamentals

    【讨论】:

    • 感谢您的回答。我现在已经阅读了“launchModes”,因为我的应用确实在 Activity 上使用了 startActivity。每次我单击按钮时,都会创建一个新的 Activity 实例并将其添加到“顶部”,因此看起来它正在被重置,而实际上它只是被 Activity 的新实例“隐藏”了。我设置了“launchMode = singleTask”,现在它可以正常工作了 =)
    猜你喜欢
    • 2012-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-15
    相关资源
    最近更新 更多