2016-12-29 10 views
1

私のプログラムでは、を使ってtabsを実装しました。私はをTab2の中に入れました。私はTab2onCreateView()のfragmentTab2のすべてのメインコードを書きたいので、Tab2にスワイプするたびに、この同じコードが実行されます。 onCreateViewは()私はTAB2にスワイプするたびに呼び出されたかどうかをテストするために、私はTab2の)(onCreateViewに次の文を書いた:フラグメントクラスのonCreateView()をタブにスワイプするたびに呼び出す方法を教えてください。

text.setText("default"); 

私はTab2-をアプリやスワイプを実行したときに今、私は「デフォルトを参照してください'書かれた。今、私がこのテキストを手動で変更すると、Tab1にスワイプしてTab2に戻ります。この同じテキストが書き込まれたままです。これは明らかに私が2回目にTab2にスワイプしたときにonCreateView()が再度呼び出されなかったことを意味しますか?これをどうやって解決するのですか?

Tab2.java

import android.content.Context; 
import android.database.Cursor; 
import android.database.sqlite.SQLiteDatabase; 
import android.net.Uri; 
import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.TextView; 


public class Tab2 extends Fragment 
{ 



@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) 
{ 
    setRetainInstance(false); 
    final View rootView; 
    rootView= inflater.inflate(R.layout.fragment_tab2, container, false); 

    text.setText("default"); 
    return rootView; 
} 
} 

MainActivity.java

package com.example.nirvan.diary30; 

import android.support.design.widget.TabLayout; 
import android.support.v4.view.ViewPager; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentManager; 
import android.support.v4.app.FragmentPagerAdapter; 
import android.support.v7.widget.Toolbar; 

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

public class MainActivity extends AppCompatActivity 
{ 
public static int itemPosition; 

private Toolbar toolbar; 
private TabLayout tabLayout; 
private ViewPager viewPager; 


@Override 
protected void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 

    getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
    getSupportActionBar().setDisplayShowTitleEnabled(false); 

    viewPager = (ViewPager) findViewById(R.id.viewpager); 
    setupViewPager(viewPager); 

    tabLayout = (TabLayout) findViewById(R.id.tabs); 
    tabLayout.setupWithViewPager(viewPager); 
    viewPager.setOffscreenPageLimit(0); 



} 

private void setupViewPager(ViewPager viewPager) 
{ 
    ViewPagerAdapter adapter = new  ViewPagerAdapter(getSupportFragmentManager()); 
    adapter.addFragment(new Tab1(), "ONE"); 
    adapter.addFragment(new Tab2(), "TWO"); 
    viewPager.setAdapter(adapter); 
} 

class ViewPagerAdapter extends FragmentPagerAdapter 
{ 
    private final List<Fragment> mFragmentList = new ArrayList<>(); 
    private final List<String> mFragmentTitleList = new ArrayList<>(); 

    public ViewPagerAdapter(FragmentManager manager) { 
     super(manager); 
    } 

    @Override 
    public Fragment getItem(int position) { 
     return mFragmentList.get(position); 
    } 

    @Override 
    public int getCount() { 
     return mFragmentList.size(); 
    } 

    public void addFragment(Fragment fragment, String title) { 
     mFragmentList.add(fragment); 
     mFragmentTitleList.add(title); 
    } 

    @Override 
    public CharSequence getPageTitle(int position) { 
     return mFragmentTitleList.get(position); 
    } 
} 
} 
+0

あなたはonCreateViewで何をしたいですか?多分、これは他の方法で達成できますか? –

+0

'setUserVisibleHint'メソッドを参照してください –

+0

tab1では、私は件名のリストを用意しています。それぞれをクリックしてからTab2にスワイプすると、新しいページがEditTextで読み込まれます。私は、ユーザが入力したテキストを保存するためにTab2にSAVEボタンを持つ予定です。したがって、ユーザーがTab1で1つの件名を選択し、Tab2に行きテキストを書き込んでTab1に戻って別の件名を選択すると、Tab2にスワイプすると空のEditTextが表示されます。 – Nirvan

答えて

0

あなたはViewPager

ViewPager viewPager; 

を使用している場合は01でsetOnPageChangeListenerを使用してみてくださいTab2

public void changeText(String string){ 
    text.setText(string); 
} 

viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { 
     @Override 
     public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { 

     } 

     @Override 
     public void onPageSelected(int position) { 
      if(mFragmentList.size() > position && mFragmentList.get(position) instanceof Tab2) 
      { 
       ((Tab2)mFragmentList.get(position)).changeText("changed text") 
      } 
// you can use interface insted 
     } 

     @Override 
     public void onPageScrollStateChanged(int state) { 

     } 
    }); 

更新MainActivity.java

public class MainActivity extends AppCompatActivity 
{ 
public static int itemPosition; 

private Toolbar toolbar; 
private TabLayout tabLayout; 
private ViewPager viewPager; 
ViewPagerAdapter adapter; 
private final List<Fragment> mFragmentLists = new ArrayList<>(); 

@Override 
protected void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 

    getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
    getSupportActionBar().setDisplayShowTitleEnabled(false); 

    viewPager = (ViewPager) findViewById(R.id.viewpager); 
    setupViewPager(viewPager); 

    tabLayout = (TabLayout) findViewById(R.id.tabs); 
    tabLayout.setupWithViewPager(viewPager); 
    viewPager.setOffscreenPageLimit(0); 

    viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { 
     @Override 
     public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { 

     } 

     @Override 
     public void onPageSelected(int position) { 
      if(mFragmentList.size() > position && mFragmentList.get(position) instanceof Tab2) 
      { 
       ((Tab2)mFragmentList.get(position)).changeText("changed text") 
      } 
// you can use interface insted 
     } 

     @Override 
     public void onPageScrollStateChanged(int state) { 

     } 
    }); 

} 

private void setupViewPager(ViewPager viewPager) 
{ 
    adapter = new ViewPagerAdapter(getSupportFragmentManager()); 
    adapter.addFragment(new Tab1(), "ONE"); 
    adapter.addFragment(new Tab2(), "TWO"); 
    viewPager.setAdapter(adapter); 

    mFragmentLists = adapter.getFragements(); 
} 

class ViewPagerAdapter extends FragmentPagerAdapter 
{ 
    private final List<Fragment> mFragmentList = new ArrayList<>(); 
    private final List<String> mFragmentTitleList = new ArrayList<>(); 

    public ViewPagerAdapter(FragmentManager manager) { 
     super(manager); 
    } 

    @Override 
    public Fragment getItem(int position) { 
     return mFragmentList.get(position); 
    } 

    @Override 
    public int getCount() { 
     return mFragmentList.size(); 
    } 

    public List<Fragment> getFragements() 
    { 
     return mFragmentList; 
    } 

    public void addFragment(Fragment fragment, String title) { 
     mFragmentList.add(fragment); 
     mFragmentTitleList.add(title); 
    } 

    @Override 
    public CharSequence getPageTitle(int position) { 
     return mFragmentTitleList.get(position); 
    } 
} 
} 
+0

このコードをonCreateView()にコピーすると、 '非静的メソッドは静的コンテキストから参照できません 'というエラーが表示されます。これを解決するために私はViewPagerオブジェクトを作成しました。しかし、そのオブジェクトを初期化するために、私はViewオブジェクトを供給しなければなりません...どのViewオブジェクトをViewPagerコンストラクタに供給しますか? – Nirvan

+0

@Ghost、これは 'MainActivity'でこのメソッドが必要で、' viewpager'は 'ViewPager'のインスタンスです。編集されたコードを参照してください –

+0

今は 'viewPagerが初期化されていない可能性があります'と言っています。最後のコメントで私の質問は、私はこのための初期化ステートメントを書く場合....どのようなビューオブジェクトを渡すのですか? – Nirvan