2011-10-17 20 views
2

我有一個抽象Activity因爲我的大部分活動都有着相同的菜單:抽象的活動引起findViewById()不工作

public abstract class ActivityBase extends Activity { 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     MenuInflater inflater = getMenuInflater(); 
     inflater.inflate(R.menu.menubar, menu); 

     return true; 
    } 

    @Override 
    public boolean onPrepareOptionsMenu(Menu menu) { 
     //... 

     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     //... 
    } 
} 

現在,當我使用類(繼承自它),該findViewById()方法不再工作了。如果我在那個特定的類中繼承它,並不重要,一旦它在繼承樹中的某個地方,它就不再工作了。例如:

public class SomeOther extends ActivityBase { 
} 

public class Home extends Activity { 

    @Override 
    public void onCreate (Bundle savedInstance) { 
    super.onCreate(savedInstance); 
    setContentView(R.layout.main); 

    Button b = (Button)findViewById(R.id.button); // fails, NullPointerException 
} 

這可能是什麼原因,更重要的是,我該如何解決這個問題?

+0

它是如何失敗?該按鈕爲空或什麼? castexception?粘貼logcat –

+0

按鈕爲空。 – Femaref

+0

是否位於同一個main.xml文件中的按鈕? – user370305

回答

0

NullPointerException是別的地方所引起,只是表現與方法。如果您從Application派生並嘗試撥打getSharedPreferences,則它會失敗,但您無法找到它。

1

在我的情況下,這個工作是完美的(試試這個)...

public abstract class ActivityBase extends Activity { 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    return true; 
} 

@Override 
public boolean onPrepareOptionsMenu(Menu menu) { 
    //.. 
    return true; 
} 
} 

public class MyActActivity extends ActivityBase { 
/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    Log.e("HI", "Hello"); 
    TextView tv=(TextView)findViewById(R.id.Settings_phoneNumbersT1); 
    Log.e("HI", tv.toString()); 
} 
} 

main.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    > 

    <TextView 
     android:id="@+id/Settings_phoneNumbersT1" 
     android:textSize="14sp" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:textColor="#ffffff" android:text="Hellofffff"/> 


</LinearLayout> 

所以,我不認爲這是抽象ActivityBase類的問題。

+0

對不起,我在我的樣品中忘了。我當然調用了'setContentView(...)'。 – Femaref

+0

是的,它現在也適用於我。原因在別的地方,只是表現在那裏。 – Femaref

+0

那麼,接受答案呢?老闆。 :-) – user370305

0

試試這個...

Button b = (Button)Home.this.findViewById(R.id.button); 

它,以確保您的當前類的findviewById叫,而不是超類的..

+0

該按鈕仍爲空。 – Femaref