2016-05-09 8 views
-1

インタフェースno bundleを使用して、アクティビティからバンドルにデータを渡したいとします。 以下のコードを見ていてください:インタフェースからデータをアクティビティに渡す

インタフェース:

public interface FragmentCommunicator { 

    public void passData(String name); 
} 

MainActivity

public class MainActivity extends AppCompatActivity{ 

    FragmentCommunicator fragmentCommunicator; 
    private Fragment fragment; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     Button b = (Button) findViewById(R.id.button); 
     b.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       fragment= new Fragment(); 
       fragmentCommunicator = (FragmentCommunicator) getApplication(); 
       fragmentCommunicator.passData("hello"); 
       getSupportFragmentManager().beginTransaction().replace(R.id.container ,fragment).commit(); 

      } 
     }); 

    } 
} 

断片

public class Fragment extends android.support.v4.app.Fragment implements FragmentCommunicator { 

    FragmentCommunicator communicator; 
    Context c; 

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

     return view; 
    } 

    @Override 
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 
     super.onViewCreated(view, savedInstanceState); 

    } 

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

    } 
    @Override 
    public void passData(String name) { 
     Toast.makeText(c, name, Toast.LENGTH_SHORT).show(); 
    } 
} 

を私はちょうど私がクリックしたときに、いくつかの文字列を渡したいですボタンを押してフラグメントを起動し、フラグメントが起動されたときにはその文字列.. 助けてください 助けていただければ幸いです。

+0

アクティビティから渡す方法 - http://stackoverflow.com/a/9245510/6254066 – AgileNinja

+0

@AgileNinjaバンドルではなくインターフェイスを使用してデータを渡したいと言っています。 –

答えて

2

このコード行をonCreateメソッドの後に記述します。この

public class MainActivity extends AppCompatActivity{ 

FragmentCommunicator fragmentCommunicator; 
private Fragment fragment; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    Button b = (Button) findViewById(R.id.button); 

    fragment= new Fragment(); 
    fragmentCommunicator = (FragmentCommunicator) getApplication(); 
    //fragmentCommunicator.passData("hello"); 
    getSupportFragmentManager().beginTransaction().replace(R.id.container ,fragment).commit(); 

    b.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 

      fragmentCommunicator.passData("Hello"); 

     } 
    }); 

    } 

    //Here is new method 
    public void passVal(FragmentCommunicator fragmentCommunicator) { 
     this.fragmentCommunicator = fragmentCommunicator; 

    } 
} 

よう

public void passVal(FragmentCommunicator fragmentCommunicator) { 
    this.fragmentCommunicator = fragmentCommunicator; 
} 

気にいらは、その後、あなたのフラグメントのonCreateView()へのコード行を記述します。このようなもの

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

((MainActivity) getActivity()).passVal(new FragmentCommunicator() { 
     @Override 
     public void passData(String name) { 
      Toast.makeText(c, name, Toast.LENGTH_SHORT).show(); 
     } 
    }); 
    return view; 
} 

注:フラグメントにFragmentCommunicatorインターフェイスを実装する必要はありません。それがうまくいくと思う。それは私のために働く。私はテストしました

+0

どこからフラグメントを開始すればよいですか?すなわちトランザクションを開始しますか? –

+0

コードが更新されました。もう一度お試しください。 – Masum

+1

java.lang.ClassCastException:android.app.Applicationをcom.example.akshaysood.interfacecallback.FragmentCommunicatorにキャストできません –

0

アクティビティにはフラグメントが含まれているため、何も渡す必要はありません。 1つの手法は、データをアクティビティスコープに格納し、getActivity()を使用してデータを参照する方法です。あなたがフラグメント内のあなたのパスデータメソッドを呼び出すところ

Best practice to reference the parent activity of a fragment?

は限りあなたが投稿コードとして、私は表示されません。 onviewcreated()で呼び出すことをお勧めします。

モバイルデバイスでこれを行うのが難しいことが判明したので、後でサンプルコードを提供しようとします。

パスワードを試す(getActivity().someStringVariable);

+0

データを渡してデータにアクセスする方法は簡単ですか? –

0

あなたのFragmentクラスには、TAGフィールドがあります。フラグメントFragmentを命名すると、それはAndroidのFragmentと同じ名前であるとして少し混乱することができますので、私はExampleFragmentを使用します。

public class ExampleFragment extends android.support.v4.app.Fragment implements FragmentCommunicator { 
    public static final String TAG = "ExampleFragment"; 

    // ... 
} 

を今、あなたは活動中の断片を交換する際に、TAGに合格することを確認してください:お使いの場合には、それはFragment.TAGだろうが、私はFragment.TAGは、Android SDKの一部ではないことを明確にするためにExampleFragmentを使用することを

getSupportFragmentManager().beginTransaction().replace(R.id.container ,fragment, ExampleFragment.TAG).commit(); 

注意。

あなたの断片を見つけるためにFragmentManagerを使用して、あなたの活動のあなたのフラグメントの参照を取得するには、次の

Fragment myFragment = getSupportFragmentManager().findFragmentByTag(ExampleFragment.TAG); 

あなたはその後、myFragmentnullないことを確認し、FragmentCommunicatorにキャストすることができます

if (myFragment != null) { 
    fragmentCommunicator = (FragmentCommunicator) myFragment; 
} 

fragmentCommunicator = (FragmentCommunicator) getApplication();は、あなたのアプリケーションではなくインターフェイスを実装しているフラグメントであるため、無効であることに注意してください。

関連する問題