【问题标题】:Two different layouts are not working on single activity两种不同的布局不适用于单个活动
【发布时间】:2014-09-01 10:56:39
【问题描述】:

我有两个 xml 布局,其中一个活动我使用 setContentView() 来调用它们,但是当我调用第二个视图时,它调用但不起作用。 这是代码: 当我单击 fok 按钮时,会显示第二个布局,但其上的按钮不起作用。请帮忙

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //setContentView(R.layout.activity_reset_pas);
    setContentView(R.layout.forpasrest);

    fok.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                fok.setBackgroundColor(Color.rgb(220, 215, 255));
                setContentView(R.layout.activity_reset_pas);

                flag=false;
            }

    });

    fback.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                fback.setBackgroundColor(Color.rgb(220, 215, 255));

                Intent intent = new Intent(ResetPasActivity.this,SignInActivity.class);
                startActivity(intent);
                finish();

            }
    });

    if(flag==false){

        ok.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub

                    Toast.makeText(getApplicationContext(), result, Toast.LENGTH_SHORT).show();

            }
        });

        back.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                back.setBackgroundColor(Color.rgb(220, 215, 255));
                Intent intent = new Intent(ResetPasActivity.this,SignInActivity.class);
                startActivity(intent);
                finish();
            }
        });
    }
}

【问题讨论】:

  • 显示了布局,但是当我尝试在第二个布局上工作时,出现了在代码显示时单击按钮的问题
  • 当我调用 setContentView(second_layout) 时显示正常,但无法正常工作
  • 我想这是因为flag 在调用onCreate 时为假。所以ok.setOnClickListenerback.setOnClickListener 永远不会被设置。当点击fok 时,您必须调用这些方法。

标签: android xml android-layout


【解决方案1】:

您应该为您的第二个 XML 布局创建第二个活动,而不是尝试更改单个活动的布局。有关如何执行此操作的详细信息,请阅读Starting Another Activity

【讨论】:

    【解决方案2】:

    添加到 sergiome 的评论:您应该初始化您的 okback 按钮之后您已经在此处设置了第二个布局 setContentView(R.layout.activity_reset_pas)。这是修改后的代码。

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //setContentView(R.layout.activity_reset_pas);
        setContentView(R.layout.forpasrest);
    
        fok.setOnClickListener(new View.OnClickListener() {
    
                @Override
                public void onClick(View v) {
                    buildSecondLayout();
                }
    
        });
    
        fback.setOnClickListener(new View.OnClickListener() {
    
                @Override
                public void onClick(View v) {
                    // TODO Auto-generated method stub
                    fback.setBackgroundColor(Color.rgb(220, 215, 255));
    
                    Intent intent = new Intent(ResetPasActivity.this,SignInActivity.class);
                    startActivity(intent);
                    finish();
    
                }
        });
    }
    
    private void buildSecondLayout() {
        fok.setBackgroundColor(Color.rgb(220, 215, 255));
        setContentView(R.layout.activity_reset_pas);
    
        final Button ok = (Button)findViewById(R.id.yourButtonIdForOk);
        final Button back = (Button)findViewById(R.id.yourButtonIdForBack);
    
        ok.setOnClickListener(new View.OnClickListener() {
    
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
    
                Toast.makeText(getApplicationContext(), result,
                        Toast.LENGTH_SHORT).show();
    
            }
        });
    
        back.setOnClickListener(new View.OnClickListener() {
    
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                back.setBackgroundColor(Color.rgb(220, 215, 255));
                Intent intent = new Intent(ResetPasActivity.this,
                        SignInActivity.class);
                startActivity(intent);
                finish();
            }
        });
    }
    

    您的代码流程似乎很混乱,我什至不知道如何向您解释问题。不管怎样,试试这个代码,看看它是否适合你。

    【讨论】:

    • 首选的解决方案是使用第二个活动。
    • 为什么投反对票?我认为两次调用 setContentView 没有错。作为参考:stackoverflow.com/questions/5808026/… 并且仅仅因为您认为您的解决方案更好并且您的声誉更高,并不会给您否决我的权利。我的答案是有效的,他唯一想看到的是他的代码不起作用的解决方案。
    • “为什么投反对票?”因为我认为这个答案“没有用”,因为它促进了不良的编程实践。创建两个单独的 Activity 更加简洁且易于维护。
    • 我只是提供了他的代码的修改版本。如果您想添加更好的答案,请彻底解释,以便他理解。也提供您的代码。虽然您认为您的答案更好,但它甚至没有显示解决真正问题的解决方案,即他的代码流程。您的解决方案仅仅是对我的答案的建议/改进/更改,仅此而已。您应该对您的答案投反对票。
    • 感谢您的帮助,两种方法都运行良好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-10
    • 1970-01-01
    • 2015-08-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多