1

以下は私のTabクラスです。選択した場合と選択しない場合のタブの色を変更しようとしています。しかし、tabHost.setOnTabChangedListener(MyOnTabChangeListener)?を呼び出すと、アプリがクラッシュします。そのメソッドでアプリを起動することすらできず、nullpointerexceptionが発生します。どうしたらいいのかわからない?何か案は?/よろしく

@SuppressWarnings("deprecation")
public class Tabs extends TabActivity
{
private static final String TAG = "TabHostActivity";
private boolean mHaveShownStartDialog = false;
static TabHost tabHost;

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

    try
    {

        addTab(getString(R.string.Search), R.drawable.searchtab, SearchTask.class );
        addTab(getString(R.string.Bookmarks), R.drawable.blackheart1, Bookmarks.class );
        addTab(getString(R.string.Latest), R.drawable.clock3, Latest.class );
        addTab(getString(R.string.QAndA), R.drawable.pen, LatestFeedback.class );

        getTabHost().setCurrentTab( 0 );
        tabHost.setOnTabChangedListener(MyOnTabChangeListener);


    }
    catch(Exception e)
    {
        Log.e(TAG, e.getMessage());
    }


}

public static OnTabChangeListener MyOnTabChangeListener = new OnTabChangeListener(){

    public void onTabChanged(String tabId) {
      for(int i=0;i<tabHost.getTabWidget().getChildCount();i++)
      {
          tabHost.getTabWidget().getChildAt(i).setBackgroundColor(Color.WHITE);
      }

      tabHost.getTabWidget().getChildAt(tabHost.getCurrentTab()).setBackgroundColor(Color.GRAY);
    }
};





//public static void setTabColor(TabHost tabhost) {
//    for(int i=0;i<tabhost.getTabWidget().getChildCount();i++)
//    {
//        tabhost.getTabWidget().getChildAt(i).setBackgroundColor(Color.parseColor("#FF0000")); //unselected
 //   }
 //   tabhost.getTabWidget().getChildAt(tabhost.getCurrentTab()).setBackgroundColor(Color.parseColor("#0000FF")); // selected
//}


private void addTab( CharSequence label, int drawable_id, Class<?> c ) 
{
    TabHost.TabSpec spec = getTabHost().newTabSpec("tab" + " "+ label);

    spec.setIndicator( label, getResources().getDrawable( drawable_id ) );

    spec.setContent( new Intent().setClass( this, c ) );

    getTabHost().addTab( spec );
}

@Override
public boolean onCreateOptionsMenu(Menu menu) 
{
    MenuInflater inflater = getMenuInflater();
    inflater.inflate( R.menu.tabs_menu, menu );
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) 
{
    switch ( item.getItemId() ) 
    {
        case R.id.tabs_menu_options_item:
            //startActivityForResult( new Intent( this, Options.class ) , 0 ); 
            return true;

        default: return super.onOptionsItemSelected(item);
    }
}

private void setOnCreatePreferences()
{
    SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences( getBaseContext() );

    boolean mUseStartDialog = preferences.getBoolean( "use_dialog", true );
    if( mUseStartDialog ) 
    {
        if( !mHaveShownStartDialog )
        {
            mHaveShownStartDialog = true;
            startActivity( new Intent( this, WelcomeDialog.class ) );
        }
    }
}

}

4

2 に答える 2

2

tabHost 変数を初期化する場所がわかりません。

于 2012-09-06T20:04:32.587 に答える
0

OnTabChangeListener を介してそれを行わないでください。ユーザーがタブを押すたびにコードを呼び出す必要はありません;)直後に書くことができます

getTabHost().setCurrentTab( 0 );

これは、このシナリオで使用するコードです。

TabWidget widget = tabHost.getTabWidget();
int size = widget.getChildCount();
for (int i = 0; i < size; i++) {

    // Hail to the master of unreadable code!
    ((TextView)((ViewGroup)widget.getChildAt(i)).findViewById(android.R.id.title)).setTextColor(0xffffffff);
    widget.getChildAt(i).setBackgroundResource(R.drawable.tab_widget_background_selector);
}

ここで私が提案しているのは、セレクターを使用して、プラットフォームにすべてを処理させるべきだということです。

<?xml version="1.0" encoding="utf-8"?>
<selector
  xmlns:android="http://schemas.android.com/apk/res/android">
  <item 
    android:state_selected="true"
    android:drawable="@drawable/tab_widget_background_selected"/>
  <item
    android:drawable="@drawable/tab_widget_background_casual"/>
  </selector>
于 2012-09-06T20:21:54.143 に答える