2017-06-28 10 views
0

私はMainActivityHomeTabsの3つのタブ(A B C)を持っています。リフレッシュをtab Cに設定しました。私はどのようにしてTabLayoutの断片を完成させることができますか?

私の構造は、私はタブCにonRefreshをトリガするとき、私はMainActivity に切り替えてHomeTabsを表示するには、再度データをロードしますです。

私の問題は、finish();をクリックすると、レイアウトはtab Cと表示されます。 getActivity().getSupportFragmentManager().beginTransaction().remove(this).commit(); または((MainActivity)getActivity()).removeFragment(getActivity());

それらの両方 iが戻ってクリックしたときに、私はまだ、すぐにアプリを終了することができない、何の作業ではない:

は、私のようなFragment使用を終了してみてください。

私はそれを逃した何かを教えてくれる人もいます。

マイHomeTabsFragmentを拡張することがViewPagerを使用してTabLayout 3つのタブ

MainActivity追加:

public class MyLineChart extends Fragment implements SwipeRefreshLayout.OnRefreshListener{ 

@Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.fragment_my_line_chart, container, false); 

     //..................... 

     return view; 
    } 
     @Override 
     public void onRefresh() { 
      refreshLayout.setRefreshing(false); 
      // Both of them are no working. 
      //((MainActivity)getActivity()).removeFragment(getActivity()); 
      //getActivity().getSupportFragmentManager().beginTransaction().remove(this).commit(); 
      Intent intent = new Intent(getActivity(),MainActivity.class); 
      intent.putExtra("refresh", true); 
      startActivity(intent); 
     } 

最後に私のHomeTabs:ここ

public class MainActivity extends AppCompatActivity { 

    private FrameLayout frameLayout; 
    private Toolbar toolBar; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
frameLayout = (FrameLayout) findViewById(R.id.frameLayout); 
     // Load the main Fragment 
     if (savedInstanceState == null) { 
      switchFragment(HomeTabs.newInstance()); 
     } 
     //take the onRefresh data,send data to HomeTabs and open tab C 
     if (getIntent().hasExtra("refresh")) { 
      boolean isRefresh = getIntent().getExtras().getBoolean("refresh"); 
      if (isRefresh) { 

       Bundle bundle = new Bundle(); 
       bundle.putBoolean("refresh", isRefresh); 
       HomeTabs homeTabs = new HomeTabs(); 
       homeTabs.setArguments(bundle); 
       switchFragment(homeTabs); 
      } 
     } 
    } 

    public void switchFragment(Fragment fragment) { 
     FragmentManager manager = getSupportFragmentManager(); 
     FragmentTransaction transaction = manager.beginTransaction(); 
     transaction.replace(R.id.frameLayout, fragment); 
     transaction.addToBackStack(null); 
     transaction.commit(); 
    } 
    // I try to finsh my tab C , it's no working 
    public void removeFragment(Activity activity) { 
     activity.onBackPressed(); 
    } 
@Override 
    public boolean onKeyDown(int keyCode, KeyEvent event) { 
     if (keyCode == KeyEvent.KEYCODE_BACK) { 
      new DialogHandler(this).quickDialog(
        getResources().getString(R.string.quick), 
        getResources().getString(R.string.confirm), 
        getResources().getString(R.string.cancel), 
        new DialogInterface.OnClickListener() { 
         @Override 
         public void onClick(DialogInterface dialog, int which) { 
          // If i onRefrsh three times , i will finsh three times... here is my issue. 
          finish(); 
         } 
        }, new DialogInterface.OnClickListener() { 
         @Override 
         public void onClick(DialogInterface dialog, int which) { 

         } 
        }); 
     } 
     return super.onKeyDown(keyCode, event); 
    } 
} 

を私のタブCフラグメントは、リフレッシュメソッドをコールバックであります断片化した日付とショーのタブC:

Bundle bundle = getArguments(); 
    if (bundle != null) { 
     boolean isRefresh = bundle.getBoolean("refresh"); 
     if (isRefresh) { 
      //tab C position is 2 
      tabLayout.getTabAt(2).select(); 
     } 
    } 

答えて

1

はあなたがRefreshクリックで再び活動を始めているコードの下に追加するには、このソリューションを試してみてください、次のように: -

intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_SINGLE_TOP); 

OR

更新しますMainActivity.java

1)

public void refreshFragment() { 
    Bundle bundle = new Bundle(); 
    bundle.putBoolean("refresh", isRefresh); 
    HomeTabs homeTabs = new HomeTabs(); 
    homeTabs.setArguments(bundle); 
    switchFragment(homeTabs); 
} 

今だけstartActivity(リフレッシュ)コードを交換するフラグメントタブCからそれを呼び出すMainActivityに機能を追加します。 :

MainActivity mainActivity = (MainActivity) getActivity(); 
mainActivity.refreshFragment(); 
+0

ご返信ありがとうございますが、私の 'startActivity(intent);'の前にあなたのコードを試してみると、私のリフレッシュについては何の働きもありません。 –

+0

アクティビティではなくTAb Cをもう一度置き換えてください。再起動して更新してください。 –

+0

最新の回答をお試しください。 –

1

あなたが

public class MyLineChart extends Fragment implements SwipeRefreshLayout.OnRefreshListener { 
    private MyLineChartListener fragmentListener; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.fragment_my_line_chart, container, false); 

     //..................... 

     return view; 
    } 

    @Override 
    public void onAttach(Context context) { 
     super.onAttach(context); 

     if (context instanceof MyLineChartListener) { 
      fragmentListener = (MyLineChartListener) context; 
     } else { 
      // throw an error 
     } 

    } 

    @Override 
    public void onRefresh() { 
     refreshLayout.setRefreshing(false); 
     // Both of them are no working. 
     //((MainActivity)getActivity()).removeFragment(getActivity()); 
     //getActivity().getSupportFragmentManager().beginTransaction().remove(this).commit(); 
     fragmentListener.onSettingRefresh(); 
    } 

    public interface MyLineChartListener { 
     void onSettingRefresh(); 
    } 
} 

は、あなたがリスナーを実装する必要があなたのfragmentCコードにインターフェイスを追加する必要があることを意味し、あなたの親アクティビティ で機能を起動することができ、あなたのフラグメントでリスナーを追加することができますMainActivityコードで

public class MainActivity extends AppCompatActivity implements MyLineChart.MyLineChartListener { 

    private FrameLayout frameLayout; 
    private Toolbar toolBar; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     frameLayout = (FrameLayout) findViewById(R.id.frameLayout); 
     // Load the main Fragment 
     if (savedInstanceState == null) { 
      switchFragment(HomeTabs.newInstance()); 
     } 

    } 

    public void switchFragment(Fragment fragment) { 
     FragmentManager manager = getSupportFragmentManager(); 
     FragmentTransaction transaction = manager.beginTransaction(); 
     transaction.replace(R.id.frameLayout, fragment); 
     transaction.addToBackStack(null); 
     transaction.commit(); 
    } 

    // I try to finsh my tab C , it's no working 
    public void removeFragment(Activity activity) { 
     activity.onBackPressed(); 
    } 

    // this function will be called when the fragment is refreshed 
    @Override 
    public void onSettingRefresh() { 
     Bundle bundle = new Bundle(); 
     bundle.putBoolean("refresh", true); 
     HomeTabs homeTabs = new HomeTabs(); 
     homeTabs.setArguments(bundle); 
     switchFragment(homeTabs); 
    } 

    @Override 
    public boolean onKeyDown(int keyCode, KeyEvent event) { 
     if (keyCode == KeyEvent.KEYCODE_BACK) { 
      new DialogHandler(this).quickDialog(
        getResources().getString(R.string.quick), 
        getResources().getString(R.string.confirm), 
        getResources().getString(R.string.cancel), 
        new DialogInterface.OnClickListener() { 
         @Override 
         public void onClick(DialogInterface dialog, int which) { 
          // If i onRefrsh three times , i will finsh three times... here is my issue. 
          finish(); 
         } 
        }, new DialogInterface.OnClickListener() { 
         @Override 
         public void onClick(DialogInterface dialog, int which) { 

         } 
        }); 
     } 
     return super.onKeyDown(keyCode, event); 
    } 
} 
+0

あなたの提案をお寄せいただきありがとうございます。あなたのコードを一歩一歩試してみてください。私の 'finish'問題は解決されましたが、私のリフレッシュについてはタブCのレイアウトが消えてしまいました。' if(savedInstanceState == null){ switchFragment(HomeTabs。newInstance()); } 'なぜ私の'タブC 'は消えますか?なぜ分かるの?再度、感謝します。 –

関連する問題