setContentView不会为按钮附加click事件

时间:2016-08-11 09:46:51

标签: java android

要求

应用程序要求是当用户第一次安装并打开时,他将显示LoginActivity并且一旦他成功登录,他将被要求输入4位数passcode,以便在未来,如果应用程序保持空闲状态并且手机被锁定。

设计

我决定在One Activity MainActivity中设计{和} contentView并在LoginActivity加载@Override protected void onCreate(Bundle savedInstanceState) { isUserValid=false; //just for testing on initial screen i.e. Login super.onCreate(savedInstanceState); if(isUserValid) { setContentView(R.layout.activity_main); } else{ setContentView(R.layout.activity_login); } } @Override protected void onResume(){ super.onResume(); if(isUserValid) { setContentView(R.layout.activity_main); } else{ setContentView(R.layout.activity_login); } } @Override protected void onStart(){ super.onStart(); if(isUserValid) { setContentView(R.layout.activity_main); } else{ setContentView(R.layout.activity_login); } }

代码部分

MainActivity.java

@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_login);

    //Attaching click event to button
    Button btnValidate=(Button)findViewById(R.id.validate_code);
    btnValidate.setOnClickListener(new View.OnClickListener(){
        @Override
        public void onClick(View view) {
            //Functionality
        }
    });
}

LoginActivity.java

activity_login.xml

我知道我可以将点击事件直接附加到setActivity()中的按钮,但只有当我们使用setContentView代替setContentView并且我应该使用{{1这里因为我不希望用户在单击后退按钮时在这两个视图之间导航。我还尝试在其他情况下onCreate MainActivity.java上添加点击事件按钮,如下所示:

@Override
protected void onCreate(Bundle savedInstanceState) {
    isUserValid=false; //just for testing on initial screen i.e. Login
    super.onCreate(savedInstanceState);
    if(isUserValid) {
        setContentView(R.layout.activity_main);
    }
    else{
        setContentView(R.layout.activity_login);
        //Attaching click event to button
        Button btnValidate=(Button)findViewById(R.id.validate_code);
        btnValidate.setOnClickListener(new View.OnClickListener(){
             @Override
             public void onClick(View view) {
                  //Functionality
             }
        });
    }
}

但这没有帮助。此外,我前进并尝试在活动的onStartonResume个状态中附加活动,但是,无效。点击事件根本没有被触发。我确保id中存在activity_login.xml的按钮。那是什么意思呢?我没有获得功能,我刚刚开始学习Android。希望找到一些解决此问题的方法。

2 个答案:

答案 0 :(得分:3)

我强烈建议您使用多个片段,但仍然可以通过编程方式添加内容视图,如下所示:

View login = this.getLayoutInflater().inflate(R.layout.activity_login);
addContentView(login, new ViewGroup.MarginLayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));

您可以使用膨胀的登录来查找视图并附加侦听器。

要删除登录信息,您可以使用

((ViewGroup)getWindow().getDecorView()).removeView(login);

我再次不推荐这种方法。使用片段或自定义对话框会更好。

希望这会有所帮助。

答案 1 :(得分:1)

尝试使用片段而不是不同的内容视图。

活动xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">

<FrameLayout
    android:id="@+id/content"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

</LinearLayout>

活性

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    FragmentManager fm = getFragmentManager();
    FragmentTransaction ft = fm.beginTransaction();

    if (isUserValid) {
        ft.replace(R.id.content, new LoggingFragment(), "loggingFragment");
    } else {
        ft.replace(R.id.content, new MainFragment(), "mainFragment");
    }
    ft.commit();
}

片段xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
       android:layout_width="match_parent"
       android:layout_height="match_parent"
       android:orientation="vertical">

<Button
       android:id="@+id/button"
       android:layout_width="match_parent"
       android:layout_height="match_parent" />

</LinearLayout>

片段

@Override
protected View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.fragment, null);

    Button btnValidate=(Button)v.findViewById(R.id.validate_code);
    btnValidate.setOnClickListener(new View.OnClickListener(){
        @Override
        public void onClick(View view) {
            //Functionality
        }
    });

    return v;
}