2012-09-06 2 views
1

다음은 내 Tab 클래스입니다. 선택하고 선택을 취소하면 탭의 색상을 변경하려고합니다. 하지만 전화를 걸면 앱이 다운됩니다. tabHost.setOnTabChangedListener (MyOnTabChangeListener)?. 그 방법으로 앱을 시작할 수 없으며 nullpointerexception을 제공합니다. 나는 무엇을해야할지 모르겠다. 어떤 아이디어?/Android의 탭에서 색상을 변경하려고합니다.

@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)); 
     } 
    } 
} 

}

답변

2

당신이 tabHost 변수를 초기화 어디 볼 ​​수 없습니다 안부.

+0

(Ha! Good catch.) 올바른 경우 NullPointerException은'null.setOnTabChangedListener()'를 호출하여 발생합니다. – Sam

+0

건배, 정말 바보 같았 어. 이제 getTabHost.setOnTabChangedListener()를 호출합니다. 때로는 자신의 코드가 눈이 어두워지는 경우도 있습니다.). 이제는 앱을 시작할 수 있지만 탭을 변경하려고하면 새로운 nullpointerexception이 발생하고 행에 충돌이 발생합니다. ** (int i = 0; i

+0

tabhost 변수를 언제 어떻게 초기화하는지에 대한 질문 코드를 업데이트하십시오. 또한 나는 TabActivity를 처음부터 가지 않을 것입니다. 태블릿 화면에 필요한 단편 지원이 부족합니다. 대신 tabhost를 별도의 위젯으로 사용하십시오. 여기서는 매우 쉽고 읽기 쉬운 예제 코드를 찾을 수 있습니다. [TabActivity] (http://developer.android.com/reference/android/app/TabActivity.html) –

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> 
관련 문제