【问题标题】:Intent does not work from within onClickListener?Intent 在 onClickListener 中不起作用?
【发布时间】:2011-11-04 23:36:09
【问题描述】:

在我编写的代码中,我打算在 onclicklistener 中打开一个新活动,但它不起作用。侦听器中的其他代码可以工作,如果我将相同的意图放在侦听器之外的“备用位置”中,它也可以工作。所以我不确定这里有什么问题。非常感谢任何帮助,谢谢。

这是选项卡活动中使用的代码,其中包含为其编写侦听器的按钮。

public class RemaindersPage extends Activity
{
    com.commsware.pgtracker.RemainderControl rc1;
    int count;
    LinearLayout.LayoutParams lp1,lp2;
    Button btn1,btn2,btn3;
    LinearLayout ll1,ll2;
    Intent i;

    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.remainders);
        //<Alternate Location> : Intent works if placed here

        TabHost th=(TabHost)findViewById(R.id.tabhost);
        th.setup();

        TabHost.TabSpec spec=th.newTabSpec("tag1");
        spec.setContent(R.id.tab1);
        spec.setIndicator("REMAINDERS");
        th.addTab(spec);

        spec=th.newTabSpec("tag2");
        spec.setContent(R.id.tab2);
        spec.setIndicator("AUTO REMAINDERS");
        th.addTab(spec);

        spec=th.newTabSpec("tag3");
        spec.setContent(R.id.tab3);
        spec.setIndicator("USER REMAINDERS");
        th.addTab(spec);

        //adding remainder control
        int ht=LayoutParams.WRAP_CONTENT;
        int wt=LayoutParams.FILL_PARENT;
        lp1=new LinearLayout.LayoutParams(wt,ht);
        ll2=(LinearLayout)findViewById(R.id.tab1_ll);

        //Adding Listeners for the buttons in each tab
        //Tab1
        btn1=(Button)findViewById(R.id.tab1_add1);
        btn1.setOnClickListener(new View.OnClickListener() 
        {
            @Override
            public void onClick(View v) 
            {
                btn1.setText("");
                i=new Intent(RemaindersPage.this,weekly.class);
                startActivity(i);
                //AddRemainder();
            }
        });

        //Tab2
        btn2=(Button)findViewById(R.id.tab2_add2);
        btn2.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v) 
            {
                btn2.setText("");
                //AddRemainder();
            }
        });

        //Tab3
        btn3=(Button)findViewById(R.id.tab3_add3);
        btn3.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v) 
            {
                btn3.setText("");
                //AddRemainder();
            }
        });


    }

    //draw a new reminder_control instance
    private void AddRemainder()
    {
        rc1=new com.commsware.pgtracker.RemainderControl(RemaindersPage.this);
        rc1.setId(1000+count);
        ll2.addView(rc1,lp1); 
        rc1.SetText("MESSAGE "+Integer.toString(count),0);
        count++;
    }

    //query for all rows in the table and obtain a cursor
    /*private void fillData()
    {
        cursor=dbHelper.fetchAllReminders();
        startManagingCursor(cursor);
    }

    @Override
    protected void onDestroy() 
    {
        super.onDestroy();
        if (dbHelper != null) 
        {
            dbHelper.close();
        }
    }*/
}

【问题讨论】:

  • 提示:不要使用that,而是使用RemaindersPage.this
  • 你在 manifest 中声明了类吗?(weekly.class)
  • 'that' 是个错误,我已经更改了代码。
  • @Raghu 当放置在 setContentView() 下面的位置时,同样的意图也可以正常工作,并且新活动会自动打开。
  • 你说这是TabAcitivity,但你使用了Activity

标签: android buttonclick


【解决方案1】:

这样试试

  button.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub
        Intent myIntent = new Intent(v.getContext(),
                NextActivity.class);
        startActivityForResult(myIntent, 0);
         finish();


    }
});

【讨论】:

    【解决方案2】:

    更改:i=new Intent(that,weekly.class);

    收件人:i=new Intent(RemaindersPage.this, weekly.class);

    再试一次

    【讨论】:

    • 我现在这样做了,仍然没有区别,setText 语句也有效,因此它似乎进入了 Listener,但意图不起作用。
    【解决方案3】:

    在侦听器内部,上下文会丢失...您必须使用 v.getContext 检索它

    【讨论】:

      【解决方案4】:

      这里的“那个”是什么??使用 RemaindersPage.this 代替“那个”。你会成功的。

      【讨论】:

        【解决方案5】:

        我发现错误实际上是在xml中。 为其编写侦听器的按钮在屏幕上永远不可见。 一旦我修复它就可以了。 完全是我的错。

        【讨论】:

          【解决方案6】:

          在这里,您使用this 作为Intent() 构造函数的第一个参数。但是由于您在OnClickListener() 的范围内,您将无法访问this。所以基本上你需要获取当前活动的上下文。这可以通过在视图上调用getContext()来完成(onClickListener()的参数。

              `v.getContext()`
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-08-03
            • 1970-01-01
            相关资源
            最近更新 更多