こんにちは皆、コールフラグメントの方法
[はじめに]私はMainActivityで4つのフラグメントを処理するためにScreenSlide Pager(FragmentActivityの延長)を作成しました。私はまた、ブルートゥースの通信ソケット(RPI付き)を扱うサービスを持っています。 このサービスは、ハンドラを介してMainActivityを受け取るMainActivityに通知できます。ここ
それは、MainActivityに配置される。そして、
if(savedInstanceState == null){
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.add(R.id.pager, new MainFragment());
ft.commit();
}
:
class IncomingHandler extends Handler {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case BtCommunication.MSG_SET_VALUE:
Log.d("SERVICE", "Received from service: " + msg.arg1);
break;
case BtCommunication.MSG_GET_SOCKET_STATE:
if(msg.arg1 == 1){
Log.d("SERVICE", "Socket state: UP");
onSocketUp();
} else {
Log.d("SERVICE", "Socket state: DOWN");}
break;
default:
super.handleMessage(msg);
}
}
}
IはOnCreate関数()内の任意の他のフラグメントの前に最初に呼び出される断片(MainFragment)を有しますフラグメントはMainActivityのScreenSlidePagerAdapterでこのように処理されます。
@Override
public Fragment getItem(int position) {
Log.d("mPager.getCurrentItem", "" + mPager.getCurrentItem());
if(position == 0){
actionBar.setTitle("Accueil - Connexion");
Log.d("Fragment", "MainFragment");
return new MainFragment();
}else if(position == 1){
actionBar.setTitle("Second fragment");
Log.d("Fragment", "SecondFragment");
return new SecondFragment();
}else if(position == 2){
Log.d("Fragment", "ThirdFragment");
return new ThirdFragment();
}else if(position == 3){
Log.d("Fragment", "ItemFragment");
return new ItemFragment();
}else{
Log.d("Fragment", "ElseFragment (MainFragment)");
return new MainFragment();
}
}
ソケットが起動していないですが、私は彼がロードアニメーション(アニメーションがうまく機能している)を表示したい:
接続ソケットがUPされたら、私はこのフラグメントのメソッドを持っています不可視/読み込みアニメーションを設定します。 [/はじめに]
public void onSocketUp(){
ArcLoader.setVisibility(View.GONE);
Log.d("MAIN FRAGMENT","Arc Loader GONE");
}
私はあなたがそれを推測想定しています。私は、が活動からDOWNからUPにたびソケット状態のスイッチをそのメソッドを呼び出したいです。
以下はアクティビティの方法です。私はという喧嘩をしています。彼女は、ハンドラがサービスからの通知を検出すると正しく呼び出されますが、findfragmentbyIdがmFragをnullフラグメント(?!)として返すため、フラグメントのメソッドを呼び出すことができません。
これは、最初に呼び出された断片であり、私はそれを破壊しないからです。)
さらに、トランザクションでの新しいフラグメントの作成が失敗します(onSaveInstanceStateの後にこのアクションを実行できません)。
private void onSocketUp()
{
//Fragment mainFrag = getSupportFragmentManager().findFragmentByTag("android:switcher:" + R.id.pager + ":" + mPager.getCurrentItem());
Fragment mainFrag = getSupportFragmentManager().findFragmentById(R.id.mainfragment);
Log.d("MAIN ACTIVITY", "onSocketUp()");
if (mPager.getCurrentItem() == 0 && mainFrag != null) {
mainFrag.onSocketUp();
Log.d("SERVICE", "onSocketUp() called - Main Fragment instantiated");
}
else {
MainFragment newFragment = new MainFragment();
Bundle args = new Bundle();
args.putString(MainFragment.ARG_SOCKET_UP, "UP");
newFragment.setArguments(args);
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.pager, newFragment);
transaction.addToBackStack(null);
transaction.commit();
}
}
私はあなたが私には、追加のコードを供給したい場合は躊躇しないで、私はあなたに私の問題から来たんどこ得るために、すべての十分な情報を与えたいと考えています。
私が読むことができる他のすべてのトピックは、今まで助けていません。
ありがとうございます。あなたは活動からのフラグメントのメソッドを呼び出したい場合は
、しかし何を後で使用すること)(mFrag.onSocketUp」であります" mFragはインスタンス化されたものではありません。多分問題はここから来るでしょう。 – Xema
が編集されましたが、それは問題の原因ではありませんでした。 – Amesys