2017-06-26 12 views
0

私は、3つのフラグメントでボトムナビゲーションバーを実装する方法に関するチュートリアルに従っています。プロファイルフラグメントのテキストビューを更新する必要があるとき、私は今停止しています。 MainActivityコード:メインアクティビティからフラグメントのTextviewを変更してください

public class MainActivity extends AppCompatActivity { 
    String activeUser = "", response="myresponse"; 
    ProgressDialog progDailog; 

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

    activeUser = getIntent().getStringExtra("currentUser"); 

    setupNavigationView(); 

    new getProfileData().execute("myurl"); 

    getSupportActionBar().setTitle("Home"); 


} 


private void setupNavigationView() { 
    BottomNavigationView bottomNavigationView = (BottomNavigationView) findViewById(R.id.bottom_navigation); 
    if (bottomNavigationView != null) { 

     // Select first menu item by default and show Fragment accordingly. 
     Menu menu = bottomNavigationView.getMenu(); 
     selectFragment(menu.getItem(1)); 

     // Set action to perform when any menu-item is selected. 
     bottomNavigationView.setOnNavigationItemSelectedListener(
       new BottomNavigationView.OnNavigationItemSelectedListener() { 
        @Override 
        public boolean onNavigationItemSelected(@NonNull MenuItem item) { 
         selectFragment(item); 
         return false; 
        } 
       }); 
    } 
} 

/** 
* Perform action when any item is selected. 
* 
* @param item Item that is selected. 
*/ 
protected void selectFragment(MenuItem item) { 

    item.setChecked(true); 

    switch (item.getItemId()) { 
     case R.id.menu_home: 
      // Action to perform when Home Menu item is selected. 
      pushFragment(new HomeFragment()); 

      break; 
     case R.id.menu_news: 
      // Action to perform when News Menu item is selected. 
      pushFragment(new NewsFragment()); 
      break; 
     case R.id.menu_profile: 
      // Action to perform when Profile Menu item is selected. 
      pushFragment(new ProfileFragment()); 
      break; 
    } 
} 

/** 
* Method to push any fragment into given id. 
* 
* @param fragment An instance of Fragment to show into the given id. 
*/ 
protected void pushFragment(Fragment fragment) { 
    if (fragment == null) 
     return; 

    FragmentManager fragmentManager = getFragmentManager(); 
    if (fragmentManager != null) { 
     FragmentTransaction ft = fragmentManager.beginTransaction(); 
     if (ft != null) { 
      ft.replace(R.id.main_container, fragment); 
      ft.commit(); 
     } 
    } 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.three_dots_items, menu); 
    return true; 
} 

ProfileFragmentコード:

public class ProfileFragment extends Fragment { 

TextView profile; 

@Nullable 
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.profile_fragment, container, false); 
    profile = (TextView) view.findViewById(profileData); 
    return view; 
} 

public void updateTextView(String text){ 
    profile.setText(text); 
} 

マイprofilefragment.xmlにid profileDataとのTextViewを持っています。私のProfileFragment Javaクラスでは、プロファイルレイアウトを更新するメソッドupdateTextViewを導入しましたが、私のmainactivity.javaでこのメソッドをどこで呼び出すかわかりません。私はこのトピックに関するいくつかの質問を検索し、stackoverflowで提案されているさまざまなソリューションを試しましたが、私は主な活動でそのメソッドを呼び出そうとするたびに、nullポインタの例外エラーが発生し続けます。誰かが私を助けることができますか?あなたはMainActivityに確認する必要があり

+0

? – Jaymin

答えて

1

次のように変更:

方法を使用してタグにより、あなたのフラグメント(すなわちProfileFragment)を取得します:

Profile Fragment fragment = (ProfileFragment)getSupportFragmentManager().findFragmentByTag("tag"); 
if(fragment != null) 
fragment.updateTextView(); 

ここでタグを使用すると、フラグメントを交換しながら追加する必要があることを文字列定数であります以下 として次のコードをメイクで

変更

FragmentTransaction ft = fragmentManager.beginTransaction(); 
    if (ft != null) { 
     ft.replace(R.id.main_container, fragment,"tag"); 
0

あなたがFragmentのテキスト値のチェック最初のインスタンスを設定しようとしているときFragment

public static ProfileFragment mProfileFragment =null; 
public static ProfileFragment getInstance(){ 
if(mProfileFragment == null){ 
mProfileFragment = new ProfileFragment(); 
} 
return mProfileFragment; 
} 

そして、あなたのActivityクラス内でgetInstance()関数を作成は、ヌルかではありません。 nullでない場合はテキスト値を設定します。 Fragmentとコンテナのコンテンツを交換するとき

if(ProfileFragment.getInstance() != null){ 
textview.SetText("Your Text Value here"); 
} 
0

、あなたは常に、現在そのコンテナのIDでgetSupportFragmentManaget().findFragmentById(...)を呼び出すことにより、Fragmentを表示する得ることができます。あなたは、現在のフラグメントがProfileFragmentあるかどうかを確認して、もしそうなら、あなたの更新を行うことができます。

あなたが方法** updateTextView(文字列テキスト)**呼んだ
Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.main_container); 
    if (fragment instanceof ProfileFragment) { 
     ((ProfileFragment) fragment).updateTextView(text); 
    } 
関連する問題