【问题标题】:Android: Starting a new activity from TabHost disables onClickAndroid:从 TabHost 启动新活动会禁用 onClick
【发布时间】:2011-06-17 16:05:57
【问题描述】:

我有一个带有 4 个标签的 TabActivity。当单击其中一个选项卡中的按钮并启动新 Activity(不在 TabHost 内的新 Activity)时,新 Activity 不会注册 OnClick()。新的 Activity 甚至不能显示 Toast,这让我觉得 TabHost 以某种方式阻塞了 ui?

将 Activity 作为选项卡之一时,OnClick 可以正常工作。 任何想法这是什么原因?

我已经包含了 3 个类:

1) TabActivity

2) 开始的选项卡中的 Activity:

3) 无法注册OnClick()的新Activity


1) 选项卡活动:

public class OverView extends TabActivity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_overview);

        /** TabHost will have Tabs */
        TabHost tabHost     = (TabHost)findViewById(android.R.id.tabhost);

        /** TabSpec used to create a new tab.
         * By using TabSpec only we can able to setContent to the tab.
         * By using TabSpec setIndicator() we can set name to tab. */

        /** tid1 is firstTabSpec Id. Its used to access outside. */
        TabSpec Search      = tabHost.newTabSpec("tid1");
        TabSpec AllArtists  = tabHost.newTabSpec("tid1");
        TabSpec Favorites   = tabHost.newTabSpec("tid1");
        TabSpec About       = tabHost.newTabSpec("tid1");

        /** TabSpec setIndicator() is used to set name for the tab. */
        Search.     setIndicator("Search");
        AllArtists. setIndicator("AllArtists");
        Favorites.  setIndicator("Favorites");
        About.      setIndicator("About");

        /** TabSpec setContent() is used to set content for a particular tab. */
        Search.setContent       (new Intent(this, Search.class));
        AllArtists.setContent   (new Intent(this, AllArtists.class));
        Favorites.setContent    (new Intent(this, Favorites.class));
        About.setContent        (new Intent(this, About.class));

        /** Add tabSpec to the TabHost to display. */
        tabHost.addTab(Search);
        tabHost.addTab(AllArtists);
        tabHost.addTab(Favorites);
        tabHost.addTab(About);
    }
}

2) AllArtists(选项卡中的 Activity。单击列表项会启动一个新 Activity):

public class AllArtists extends Activity {

    // Debug
    private final String    TAG = this.getClass().getSimpleName();  

    // XML
    EditText                searchBox;
    ListView                listView;

    // Adapter
    ListAdapter             listAdapter;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_allartists);

        listAdapter = new ListAdapter(this, null);

        // XML
        listView    = (ListView)findViewById(R.id.allartists_listview);
        searchBox   = (EditText)findViewById(R.id.allartists_searchbox);

        listView.setAdapter(listAdapter);
        listView.setFastScrollEnabled(true);
        listView.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

                String memberID = (String)listAdapter.getID(position).toString();

                if (!memberID.equals("HEADER")){
                    Log.d(TAG, "Jumping to Artists.class");
                    Intent intentArtist = new Intent (AllArtists.this, Artist.class);
                    intentArtist.putExtra("ID", memberID);
                    startActivity(intentArtist);
                }
            }
        });
}

3) Artist(新的Activity启动了,这个类没有注册OnClick):

public class Artist extends Activity implements OnClickListener{

// Debug
private final String    TAG = this.getClass().getSimpleName();  

// XML
Button          favorite_btn;

LinearLayout    tel;
LinearLayout    mob;
LinearLayout    email;
LinearLayout    www1;
LinearLayout    www2;
LinearLayout    add;

TextView        name_tv;
TextView        tel_tv;
TextView        mob_tv;
TextView        email_tv;
TextView        www_tv1;
TextView        www_tv2;

// Strings
String memberID;
String sirName;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_artist);

    Toast.makeText(this, "OK, your in Activity_Artist..", Toast.LENGTH_SHORT);


    // XML
    favorite_btn    = (Button)findViewById(R.id.artist_ib_favorite);

    tel             = (LinearLayout)findViewById(R.id.artist_tel_container);
    mob             = (LinearLayout)findViewById(R.id.artist_mob_container);
    email           = (LinearLayout)findViewById(R.id.artist_email_container);
    www1            = (LinearLayout)findViewById(R.id.artist_www_container1);
    www2            = (LinearLayout)findViewById(R.id.artist_www_container2);
    add             = (LinearLayout)findViewById(R.id.artist_add_container);

    name_tv         = (TextView)findViewById(R.id.artist_tv_name);
    tel_tv          = (TextView)findViewById(R.id.artist_tel_dynamic);
    mob_tv          = (TextView)findViewById(R.id.artist_mob_dynamic);
    email_tv        = (TextView)findViewById(R.id.artist_email_dynamic);
    www_tv1         = (TextView)findViewById(R.id.artist_www_dynamic1);
    www_tv2         = (TextView)findViewById(R.id.artist_www_dynamic2);

    // OnClickListeners
    favorite_btn.setOnClickListener(this);
    tel.setOnClickListener(this);
    mob.setOnClickListener(this);
    email.setOnClickListener(this);
    www1.setOnClickListener(this);
    www2.setOnClickListener(this);
    add.setOnClickListener(this);

        // Code here to get memberID for fillContent()
}

private void fillContent(String memberID) throws JSONException {
// Code here to fill the TextViews etc with content from the DataBase.
}

@Override
public void onClick(View v) {

    switch (v.getId()){

    case R.id.artist_ib_favorite:
        Toast.makeText(this, "onClick", Toast.LENGTH_SHORT);
        Log.d(TAG, "Neo is attempting to insert member into favorites");

        MyDB db = new MyDB(this);
        db.insertFavorite(memberID, sirName);

        break;

    case R.id.artist_tel_container:
        break;

    case R.id.artist_mob_container:
        Log.d(TAG, "OMG CLICKED THE MOBILE!");
        break;

    case R.id.artist_email_container:
        break;

    case R.id.artist_www_container1:
        break;

    case R.id.artist_add_container:
        break;
    }
}

谢谢 ;)

【问题讨论】:

    标签: android onclick android-tabhost


    【解决方案1】:

    对于 Toast,您需要调用 show。

    Toast.makeText(this, "OK, your in Activity_Artist..", Toast.LENGTH_SHORT).show();
    

    对于除 Button 之外的任何内容的点击操作,您需要定义

    android:clickable="true" 
    

    在布局中。

    【讨论】:

    • 哈哈我已经不是第一次忘记添加 .show() 了。我实际上从未使用过 android:clickable="true" 并且我从来没有遇到过任何可点击的问题。不是默认设置为true吗?
    • 除此之外,鉴于这不是 TabHost Activity 的一部分,我看不出为什么不传播 click 事件的任何原因,onClick 应该在此 Activity 本身中使用。
    【解决方案2】:

    解决了这个问题。在布局中,布局底部有一个(空的)GridView 设置为 android:layout_height="fill_parent" ,它偷走了 touchevent。

    奇怪的是,当将完全相同的活动与完全相同的 XML 放入选项卡中时,onClick() 工作正常。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多