0

我有一個小應用程序,我在其中使用eclipse創建了三個可滑動的選項卡。其中一個是通用片段,而第二個和第三個是ListFragments,每個都從Cursor獲取數據。如何使用標籤運行活動中片段的方法?

我對它進行了實驗並希望刪除在託管活動的onCreate中創建的數據庫的內容。我的問題是,當我刪除數據時,第二個選項卡,其中一個ListFragments,沒有更新,而第三個選項卡是。

當第二次得到更新時,當我將手機置於睡眠狀態時,我認爲第二個選項卡並未移入其生命週期,因此它不會調用onResume。

兩個ListFragments使用相同的代碼更新:

@Override 
    public void onResume(){ 
     super.onResume(); 
     updateList(); 
     Log.i(TAG, "onResume"); 
    } 

public void updateList(){ 
     dbCursor.requery(); 
     dbAdapter.notifyDataSetChanged(); 
     Log.i(TAG, "updateList"); 
    } 

所以,我試圖用onTabSelected方法來做到這一點,但我總是得到我想要避免使用標籤NullPointerException異常,但我不明白它工作。

@Override 
    public void onTabSelected(ActionBar.Tab tab, 
      FragmentTransaction fragmentTransaction) { 
     // When the given tab is selected, switch to the corresponding page in 
     // the ViewPager. 
     mViewPager.setCurrentItem(tab.getPosition()); 
     Log.e(TAG, String.valueOf(tab.getPosition())); 
     switch(tab.getPosition()) { 
     case 0: 
      MenueFragment menu = new MenueFragment(); 
//   fragmentTransaction.add(menu, "1");//Eclipse wants to change Type of menu from MenueFragment to Fragment 
//   menu = (MenueFragment) getFragmentManager().findFragmentByTag("1"); //My latest, not working approach... 
      menu.updateList(); //In this Fragment updateList only does an entry into LogCat for testing. 
      break; 
     case 1: //These two following cases show how I tried it before. 
      GefilterteListe fragment = new GefilterteListe(); 
      fragment.updateList(); 
      break; 
     case 2: 
      GesamteListe fragment2 = new GesamteListe(); 
      fragment2.updateList(); 
      break; 
     } 
     Log.i(TAG, "onTabSelected"); 
    } 

的Eclipse總是想改變我的類型的片段到另一個片段級和希望android.app.fragment,而我想用support.v4 ...

我如何讓它工作,這樣兩個ListFragments刷新?
林全新片段和我知道光標級的折舊,但我並沒有足夠的時間來了解裝載機...:/

編輯:這是我的工作不ListFragment:

import android.content.Context; 
import android.database.Cursor; 
import android.os.Bundle; 
import android.support.v4.app.ListFragment; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 

public class GefilterteListe extends ListFragment{ 

    public static final String TAG = GefilterteListe.class.getSimpleName(); 

    private DatenbankHandler dbHandler; 
    private Cursor dbCursor; 
    private LehrerDatenbankAdapter dbAdapter; 
    private Context mContext; 

    public View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){ 
     Log.i(TAG, "GefilterteListe onCreate"); 
     View returnView = inflater.inflate(R.layout.plan, container, false); 
     return returnView; 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     dbHandler = new DatenbankHandler(getActivity()); 
     dbCursor = dbHandler.queryFilter(); 
     dbAdapter = new LehrerDatenbankAdapter(getActivity(), dbCursor); 
     setListAdapter(dbAdapter); 
     Log.i(TAG, "onCreate"); 
    } 

    @Override 
    public void onResume(){ 
     super.onResume(); 
     updateList(); 
     Log.i(TAG, "onResume"); 
    } 

    /*@Override 
    public void onPause(){ 
     super.onPause(); 
     updateList(); 
     Log.i(TAG, "onPause"); 
    }*/ 

    public void updateList(){ 
     dbCursor.requery(); 
     dbAdapter.notifyDataSetChanged(); 
     Log.i(TAG, "updateList"); 
    } 

} 

除了名稱和另一個使用queryAll()而不是queryFilter()之外,它與工作中的幾乎相同。

我的另一個片段:

import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.view.ViewGroup; 
import android.widget.Button; 
import android.widget.TextView; 

public class MenueFragment extends Fragment { 


    public static final String TAG = MenueFragment.class.getSimpleName(); 
    TextView text; 
    Button button; 
    DatenbankHandler dbHandler; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     Log.i(TAG, "MenueFragment onCreate"); 
     View returnView = inflater.inflate(R.layout.fragment_main_dummy, container, false); 
     text = (TextView) returnView.findViewById(R.id.section_label); 
     button = (Button) returnView.findViewById(R.id.button1); 

     button.setOnClickListener(new OnClickListener(){ 

      @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 
       text.setText("Datenbank gelöscht."); 
       dbHandler = new DatenbankHandler(getActivity()); 
       dbHandler.redoTbl(); 
      } 

     }); 

     return returnView; 
    } 

    public void updateList(){ 
     Log.i(TAG, "updateList nonsense"); 
    } 
} 

活動大多是相同的,比如Eclipse創建它。我只添加了我的碎片。
EDIT2:這裏是我的託管服務活動:

public class HostActivity extends FragmentActivity implements ActionBar.TabListener { 

    /** 
    * The {@link android.support.v4.view.PagerAdapter} that will provide 
    * fragments for each of the sections. We use a 
    * {@link android.support.v4.app.FragmentPagerAdapter} derivative, which 
    * will keep every loaded fragment in memory. If this becomes too memory 
    * intensive, it may be best to switch to a 
    * {@link android.support.v4.app.FragmentStatePagerAdapter}. 
    */ 
    SectionsPagerAdapter mSectionsPagerAdapter; 

    /** 
    * The {@link ViewPager} that will host the section contents. 
    */ 
    ViewPager mViewPager; 

    private static final String TAG = HostActivity.class.getSimpleName(); 
    private DatenbankHandler dbHandler; 

    private MenueFragment menueFragment; 
    private GefilterteListe gefilterteListe; 
    private GesamteListe gesamteListe; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
//  passwort("okidoki"); //Passwort Dialog 
     setContentView(R.layout.activity_main); 

     menueFragment = new MenueFragment(); 
     gefilterteListe = new GefilterteListe(); 
     gesamteListe = new GesamteListe(); 

     dbHandler = new DatenbankHandler(this); 
     dbHandler.redoTbl(); 
     dbHandler.insert("T", "E", "S", "T", "This is a ", "Test."); 
     dbHandler.insert("E", "E", "S", "T", "This is a ", "Test."); 
     dbHandler.insert("S", "E", "S", "T", "This is a ", "Test."); 
     dbHandler.insert("T ", "E", "S", "T", "This is a", "Test."); 

     // Set up the action bar. 
     final ActionBar actionBar = getActionBar(); 
     actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 

     // Create the adapter that will return a fragment for each of the three 
     // primary sections of the app. 
     mSectionsPagerAdapter = new SectionsPagerAdapter(
       getSupportFragmentManager()); 

     // Set up the ViewPager with the sections adapter. 
     mViewPager = (ViewPager) findViewById(R.id.pager); 
     mViewPager.setAdapter(mSectionsPagerAdapter); 

     // When swiping between different sections, select the corresponding 
     // tab. We can also use ActionBar.Tab#select() to do this if we have 
     // a reference to the Tab. 
     mViewPager 
       .setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() { 
        @Override 
        public void onPageSelected(int position) { 
         actionBar.setSelectedNavigationItem(position); 
        } 
       }); 

     // For each of the sections in the app, add a tab to the action bar. 
     for (int i = 0; i < mSectionsPagerAdapter.getCount(); i++) { 
      // Create a tab with text corresponding to the page title defined by 
      // the adapter. Also specify this Activity object, which implements 
      // the TabListener interface, as the callback (listener) for when 
      // this tab is selected. 
      actionBar.addTab(actionBar.newTab() 
        .setText(mSectionsPagerAdapter.getPageTitle(i)) 
        .setTabListener(this)); 
     } 

    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.host, menu); 
     return true; 
    } 

    @Override 
    public void onTabSelected(ActionBar.Tab tab, 
      FragmentTransaction fragmentTransaction) { 
     // When the given tab is selected, switch to the corresponding page in 
     // the ViewPager. 
     mViewPager.setCurrentItem(tab.getPosition()); 
     /*Log.e(TAG, String.valueOf(tab.getPosition())); 
     switch(tab.getPosition()) { 
     case 0: 
      MenueFragment menu = new MenueFragment(); 
//   fragmentTransaction.add(menu, "1");//Eclipse wants to change Type of menu from MenueFragment to Fragment 
//   menu = (MenueFragment) getFragmentManager().findFragmentByTag("1"); //My latest, not working approach... 
      menu.updateList(); 
      break; 
     case 1: 
      GefilterteListe fragment = new GefilterteListe(); 
      fragment.updateList(); 
      break; 
     case 2: 
      GesamteListe fragment2 = new GesamteListe(); 
      fragment2.updateList(); 
      break; 
     }*/ 
//  updateAll(); 
     Log.i(TAG, "onTabSelected"); 
    } 

    @Override 
    public void onTabUnselected(ActionBar.Tab tab, 
      FragmentTransaction fragmentTransaction) { 
    } 

    @Override 
    public void onTabReselected(ActionBar.Tab tab, 
      FragmentTransaction fragmentTransaction) { 
    } 

    /** 
    * A {@link FragmentPagerAdapter} that returns a fragment corresponding to 
    * one of the sections/tabs/pages. 
    */ 
    public class SectionsPagerAdapter extends FragmentStatePagerAdapter { 

     public SectionsPagerAdapter(FragmentManager fm) { 
      super(fm); 
     } 

     @Override 
     public Fragment getItem(int position) { 
      Fragment frag = new Fragment(); 
      // getItem is called to instantiate the fragment for the given page. 
      // Return a DummySectionFragment (defined as a static inner class 
      // below) with the page number as its lone argument. 
      switch(position) { 
      case 0: 
       MenueFragment menu = new MenueFragment(); 
       frag = menu; 
       break; 
      case 1: 
       Fragment fragment = new GefilterteListe(); 
       frag = fragment; 
       break; 
      case 2: 
       Fragment fragment2 = new GesamteListe(); 
       frag = fragment2; 
       break; 
      } 
      return frag; 
     } 

     @Override 
     public int getCount() { 
      // Show 3 total pages. 
      return 3; 
     } 

     @Override 
     public CharSequence getPageTitle(int position) { 
      Locale l = Locale.getDefault(); 
      switch (position) { 
      case 0: 
       return getString(R.string.title_section1).toUpperCase(l); 
      case 1: 
       return getString(R.string.title_section2).toUpperCase(l); 
      case 2: 
       return getString(R.string.title_section3).toUpperCase(l); 
      } 
      return null; 
     } 
    } 

    public void updateAll() {  
     menueFragment.updateList(); 
     gefilterteListe.updateList(); 
     gesamteListe.updateList(); 
    } 
} 
+0

你可以在這裏放一些片段嗎? – squixy 2013-05-05 15:39:43

+0

我添加了代碼。 – 2013-05-05 16:26:40

回答

0

嘗試類似的東西:

interface DBchangesListener { 
    public void updateList(); 
} 

那麼你的片段:

public class MenueFragment extends Fragment implements DBchangesListener {...} 
public class GefilterteListe extends Fragment implements DBchangesListener {...} 
public class GesamteListe extends Fragment implements DBchangesListener {...} 

在活動提出:

private MenueFragment menueFragment; 
private GefilterteListe gefilterteListe; 
private DBchangesListener gesamteListe; 

,然後在onCreate()

menueFragment = new MenueFragment(); 
gefilterteListe = new GefilterteListe(); 
gesamteListe = new GesamteListe(); 

添加您的片段像你現在添加它。
下一頁您的活動創造簡單的方法:

public void updateAll() { 
    menueFragment.updateList(); 
    gefilterteListe.updateList(); 
    gesamteListe.updateList(); 
} 

在你的DB變化剛剛結束調用updateAll()更新所有片段。

+0

謝謝,但可悲的是我不明白它的工作原理。我在你的例子中創建了一個新的接口(之前從未使用過),並在我的片段中實現它。 你確定我應該這樣做:'private DBchangesListener gesamteListe;'? GesamteListe也是我的片段之一。無論如何,我都嘗試過。這個onCreate事情對我來說很清楚。 我把updateAll()一次放在onTabSelected中,另一次放在onTabUnselected中。兩者都不起作用。 Waht我做錯了嗎?另外,我添加了我的託管活動,讓您更好地瞭解它。 – 2013-05-05 22:11:28

+0

此外:我將updateAll()放入MenueFragment中,因爲數據庫在那裏被刪除,並且也將它放在提到的onTab(Un)Selected中。 – 2013-05-05 22:27:55

+0

我不知道爲什麼你使用片段而不是活動。也許嘗試將您的課程改爲活動而不是片段 – squixy 2013-05-06 07:38:39