2012-07-05 133 views
1

我正在通過一些android教程,現在準備在美國大學的兩週營。我十七歲,所以如果這是一個愚蠢的問題,請原諒。我做了一些研究並嘗試了幾件事,但我無法實現。方法必須重寫超類方法

我的工作在這裏下車發現谷歌的選項卡/片段例子:http://developer.android.com/reference/android/app/TabActivity.html

我的問題是壓倒一切createTabContent時,和onTabChanged我不斷收到錯誤必須重寫超類方法。這是我的代碼:

package matthews.zack.test;

import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.List; 

import android.content.Context; 
import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentActivity; 
import android.support.v4.app.FragmentTransaction; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.ImageView; 
import android.widget.ListView; 
import android.widget.RadioButton; 
import android.widget.RadioGroup; 
import android.widget.TabHost; 
import android.widget.TextView; 

公共類_testActivity擴展FragmentActivity {

ListView list; 
Button save; 
RadioGroup radioGroup; 
RadioButton selectedType; 
TabHost tabHost; 
// People p = new People(); 
public List<People> people = new ArrayList<People>(); 

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

    onInitialize(); 

    if (savedInstanceState != null) { 
     tabHost.setCurrentTabByTag(savedInstanceState.getString("tab")); 
    } 
} 

private void onInitialize() { 

    tabHost = (TabHost) findViewById(R.id.tabHost); 
    tabHost.setup(); 

    * TabManager tManager = new TabManager(this, tabHost, 
    * R.id.realtabcontent); tManager.addTab(
    * tabHost.newTabSpec("details").setIndicator("Details", 
    * getResources().getDrawable(R.drawable.goldstar)), null, null); 
    * tManager.addTab(tabHost.newTabSpec("list").setIndicator("List", 
    * getResources().getDrawable(R.drawable.bluestar)), null, null); 
    * 

    * TabSpec spec = tabHost.newTabSpec("tab1"); 
    * spec.setContent(R.id.listView1); spec.setIndicator("List", 
    * getResources().getDrawable(R.drawable.goldstar)); 
    * 
    * TabSpec spec2 = tabHost.newTabSpec("tab2"); 
    * spec2.setContent(R.id.details); spec2.setIndicator("Details", 
    * getResources().getDrawable(R.drawable.bluestar)); 
    * 
    * tabHost.addTab(spec); tabHost.addTab(spec2); 
    */ 

    PeopleAdapter adapter = new PeopleAdapter(); 
    list = (ListView) findViewById(R.id.listView1); 
    list.setAdapter(adapter); 

    radioGroup = (RadioGroup) findViewById(R.id.type); 
    // radioGroup.check(R.id.coWorker); 
    radioGroup 
      .setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() { 

       public void onCheckedChanged(RadioGroup group, int checkedId) { 
        // TODO Auto-generated method stub 

        if (selectedType != (RadioButton) findViewById(radioGroup 
          .getCheckedRadioButtonId())) { 
         selectedType = (RadioButton) findViewById(radioGroup 
           .getCheckedRadioButtonId()); 
        } 
       } 
      }); 

    save = (Button) findViewById(R.id.button1); 
    save.setOnClickListener(new View.OnClickListener() { 

     public void onClick(View v) { 

      People p = new People(); 

      // TODO Auto-generated method stub 
      EditText firstName = (EditText) findViewById(R.id.editText1); 
      EditText lastName = (EditText) findViewById(R.id.editText2); 
      p.setFirstName(firstName.getText().toString());// firstName.getText().toString()); 
      p.setLastName(lastName.getText().toString());// lastName.getText().toString()); 
      p.setType(selectedType.getText().toString()); 

      people.add(p); 
     } 
    }); 
} 

static class PeopleHolder { 
    private TextView name; 
    private TextView title; 
    private ImageView icon; 

    PeopleHolder(View row) { 
     name = (TextView) row.findViewById(R.id.name); 
     title = (TextView) row.findViewById(R.id.title); 
     icon = (ImageView) row.findViewById(R.id.icon); 
    } 

    void populateForm(People p) { 
     name.setText(p.getFirstName() + " " + p.getLastName()); 
     title.setText(p.getType().toString()); 
     if (p.getType().equals("Family")) { 
      icon.setImageResource(R.drawable.android); 

     } 

     else if (p.getType().equals("Friend")) { 
      icon.setImageResource(R.drawable.xbox); 
     } 

     else { 
      icon.setImageResource(R.drawable.yinyang); 
     } 
    } 

} 

class PeopleAdapter extends ArrayAdapter<People> { 

    PeopleAdapter() { 
     super(_testActivity.this, android.R.layout.simple_list_item_1, 
       people); 
    } 

    public View getView(int position, View convertView, ViewGroup parent) { 
     View row = convertView; 
     PeopleHolder holder = null; 
     if (row == null) { 
      LayoutInflater inflater = getLayoutInflater(); 
      row = inflater.inflate(R.layout.row, null); 
      holder = new PeopleHolder(row); 
      row.setTag(holder); 
     } 

     else { 
      holder = (PeopleHolder) row.getTag(); 
     } 

     holder.populateForm(people.get(position)); 

     return (row); 
    } 

} 

@Override 
protected void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    outState.putString("tab", tabHost.getCurrentTabTag()); 
} 

public static class TabManager implements TabHost.OnTabChangeListener { 
    private final FragmentActivity activity; 
    private final TabHost host; 
    private final int containerID; 
    private final HashMap<String, TabInfo> tabs = new HashMap<String, TabInfo>(); 
    TabInfo lastTab; 

    static final class TabInfo { 
     private final String tag; 
     private final Class<?> clss; 
     private final Bundle args; 
     private Fragment fragment; 

     TabInfo(String _tag, Class<?> clss, Bundle args) { 
      this.tag = _tag; 
      this.clss = clss; 
      this.args = args; 
     } 
    } 

    static class DummyTabFactory implements TabHost.TabContentFactory { 
     private final Context context; 

     public DummyTabFactory(Context context) { 
      this.context = context; 
     } 

     public View createTabContent(String tag) { 
      View v = new View(context); 
      v.setMinimumWidth(0); 
      v.setMinimumHeight(0); 

      return v; 
     } 
    } 

    public TabManager(FragmentActivity activity, TabHost host, 
      int containerID) { 
     this.activity = activity; 
     this.host = host; 
     this.containerID = containerID; 
     this.host.setOnTabChangedListener(this); 
    } 

    public void addTab(TabHost.TabSpec tabSpec, Class<?> clss, Bundle args) { 
     tabSpec.setContent(new DummyTabFactory(activity)); 
     String tag = tabSpec.getTag(); 

     TabInfo info = new TabInfo(tag, clss, args); 

     info.fragment = activity.getSupportFragmentManager() 
       .findFragmentByTag(tag); 

     if (info.fragment != null && !info.fragment.isDetached()) { 
      FragmentTransaction ft = activity.getSupportFragmentManager() 
        .beginTransaction(); 
      ft.detach(info.fragment); 
      ft.commit(); 
     } 

     tabs.put(tag, info); 
     host.addTab(tabSpec); 
    } 

    public void onTabChanged(String tabId) { 
     TabInfo newTab = tabs.get(tabId); 
     if (lastTab != newTab) { 
      FragmentTransaction ft = activity.getSupportFragmentManager() 
        .beginTransaction(); 
      if (lastTab != null) { 
       if (lastTab.fragment != null) { 
        ft.detach(lastTab.fragment); 
       } 

      } 

      if (newTab != null) { 
       if (newTab.fragment == null) { 
        newTab.fragment =  Fragment.instantiate(activity, 
          newTab.clss.getName(), newTab.args); 
        ft.add(containerID, newTab.fragment, newTab.tag); 

       } 

       else { 

        ft.attach(newTab.fragment); 
       } 

      } 

      lastTab = newTab; 
      ft.commit(); 
      activity.getSupportFragmentManager() 
        .executePendingTransactions(); 

     } 

     // TODO Auto-generated method stub 

    } 
} 

} 

這是一個Eclipse的問題,還是我做一個紕漏?我檢查並檢查了我使用的是正確的類,並且它們包含了我試圖覆蓋的方法。提前致謝!

編輯:完整的代碼發佈。我可以編譯並運行,但應用程序部隊一旦啓動就會關閉。請幫忙!

+0

如何聲明包含onTabChanged的類? – Mark 2012-07-05 23:20:17

+1

刪除@Override – 2012-07-05 23:21:01

+2

這個社區的人們志願幫助你,即使最好的答案並不完美,你也應該接受你的舊問題的正確答案。 – Sam 2012-07-05 23:27:24

回答

7

你可能使用不同的Java版本比你的示例代碼的作者......你有兩個選擇:

  1. 您應該能夠刪除@Override線導致錯誤和運行應用沒有任何問題。

  2. 您可以在Eclipse改變從1.5 JDK的編譯器的合規性水平1.6:

    屬性 - >JDK編譯器 - >選擇 「1.6」,從編譯器符合性水平下拉 (安卓僅支持1.5和1.6,它還不支持1.7)

-1

我前一段時間也有類似的問題,並通過改變項目的compilan解決它ce級別降至1.6。

要做到這一點:

  • 右鍵單擊項目文件夾(可以在Eclipse的Project Explorer中發現,左側)
  • 屬性
  • Java編譯器
  • 取消選中「啓用項目特定的設置
  • 配置工作區設置...
  • 然後將編譯級別從1.5更改爲1.6
+1

我不認爲這會解決問題。當您執行諸如更改合規性級別之類的操作時,可能會產生比解決問題更多的問題。在完成任何事情之前,你應該看到所有的代碼,並確保有其他的東西。我們正在討論一個超越超類方法的問題。他甚至可能沒有超級班,那他爲什麼要改變合規級別? – BlackHatSamurai 2012-07-05 23:32:10

+1

當我遇到這個問題時,我在某個地方讀了一個主題,它說要將compilance級別更改爲1.6,因爲1.5有覆蓋問題。在此之後,它會很好地運作。 – 2012-07-05 23:37:10

+0

僅僅因爲它的作用並不意味着它是正確的。這可以與抑制警告相比。每次遇到超車問題時,您都不希望開始更改合規性級別。通常有一個很好的理由說明你爲什麼要收到警告,並且應該在你開始調整你的設置之前嘗試弄清楚它們是什麼。最終,這相當於糟糕的編碼,應儘可能避免。 – BlackHatSamurai 2012-07-05 23:40:13

0

沒有看到你班級的所有代碼,很難說你的問題到底是什麼。

像Sam說的,根據您使用的示例,您可能不需要使用@Override。如果你的班級沒有「擴展」類似的東西:

public class MyClass extends MySuperClass{... 

然後你不需要騎車。當你有一個超類繼承了方法,並且你想改變它們的功能時,重寫就完成了。把它想象成存儲在你正在擴展的類中的定製方法。如果您沒有超類,則無需重寫可能導致問題的方法。

另一個問題可能是您不覆蓋超類中的正確方法。

但是沒有看到所有的代碼,很難給你更具體的東西。

希望這會有所幫助。

+0

我發佈了我的完整代碼,你能幫我更好一點嗎?我現在正在接近一支部隊。 – 2012-07-05 23:47:36

+0

我在Eclipse中重寫的一件事是,如果你擺脫了重寫註釋,做一個Project> clean;它會給你一個錯誤,提示「必須重寫方法...」,你可以將鼠標懸停在錯誤行上,你將得到一個選項讓IDE用重寫註解導入這些方法。這可能會起作用。 – BlackHatSamurai 2012-07-06 00:01:52

0

舊版本的Java不喜歡使用@Override進行接口方法重寫。當時只有Super Class方法才能用於該註釋。這在1.5之後發生了變化,所以1.6和1.7不會爲覆蓋Interface方法拋出@Override的警告。你可以禁止這個警告,刪除註釋(這根本不會傷害你,但是如果你鍵入方法名或參數類型錯誤,Eclipse不會告訴你),或者你可以改變爲1.6或更高。

+0

抑制警告是糟糕的編碼。這就像在檢查引擎點亮的路上行駛。有警告是有原因的。升級您的Java版本比僅僅抑制警告更有意義。 – BlackHatSamurai 2012-07-06 00:14:35

+0

此外,錯誤與此無關。 – Erol 2012-07-06 01:29:46

+2

我說的警告不是有原因的。這是一個棄用的警告。在投票結束之前請做一些調查。你可以在這裏看到,在接口中使用@Override註解的能力只能在1.6中加入http://stackoverflow.com/questions/94361/when-do-you-use-javas-override-annotation-and-Why 這不是一個真正的警告。雖然,我的帖子可能無法解決OP的問題,但這並沒有使其不那麼有效。 – CSAntol 2012-07-06 17:14:27

相關問題