親アクティビティからFragmentメソッドを呼び出す


124

Android Fragments Dev Guideで、「findFragmentById()またはを使用してFragmentManagerからFragmentへの参照を取得することにより、アクティビティがフラグメント内のメソッドを呼び出すことができる」とわかりましたfindFragmentByTag()

次の例は、フラグメント参照を取得する方法を示していますが、フラグメント内の特定のメソッドを呼び出す方法は示していません。

誰でもこれを行う方法の例を挙げられますか?親アクティビティからフラグメント内の特定のメソッドを呼び出したいのですが。ありがとう。

回答:


210

質問が単純すぎるため、正確には取得できません。

ExampleFragment fragment = (ExampleFragment) getFragmentManager().findFragmentById(R.id.example_fragment);
fragment.<specific_function_name>(); 

更新: Kotlinを使用している人向け

var fragment = supportFragmentManager.findFragmentById(R.id.frameLayoutCW) as WebViewFragment
fragment.callAboutUsActivity()

10
OK、それは簡単でした。おかげで(私はフラグメントがまったく新しいのです)。ここで難しいのは、そもそもフラグメントへの参照を取得できないようです。XMLレイアウトで定義されていないため、findFragmentById()を使用できません。そして、私がフォローしているコード(上記を参照)からは、フラグメントが作成される方法/場所が明確ではありません。もしそうなら、タグを追加してfindFragmentByTag()を使用することができます。例のAccountListActivity部分にはbeginTransaction()。add()への呼び出しがありますが、私のトレースによると、呼び出されることはありません。これは私が頭を掻いているところです。私はどんな提案にも感謝します。
gcl1

34
フラグメントIDを取得するにはどうすればよいですか?
Narendra Singh

8
これを行うことで、nullオブジェクト参照になりました!
Alok Rajasukumaran 16

3
@Fattie、フラグメントタグがない場合はどうなりますか?
VaclovasRekašiusJr. 2017

5
フラグメントをxmlで宣言しなかった...フラグメントIDがないので、どうすればよいですか?
akash bs 2018

76

「import android.app.Fragment;」を使用している場合 次に、次のいずれかを使用します。

1)

ExampleFragment fragment = (ExampleFragment) getFragmentManager().findFragmentById(R.id.example_fragment); 
fragment.specific_function_name(); 

R.id.example_fragmentは、ほとんどの場合、XMLレイアウト内のFrameLayout IDです。または

2)

ExampleFragment fragment = (ExampleFragment) getFragmentManager().findFragmentByTag(“FragTagName”); 
fragment.specific_function_name(); 

ここで、FragTagNameは、uが実行したときに指定した名前です。

TabHost mTabHost.newTabSpec(“FragTagName”)

「import android.support.v4.app.Fragment;」を使用している場合 次に、次のいずれかを使用します。

1)

ExampleFragment fragment = (ExampleFragment) getSupportFragmentManager().findFragmentById(R.id.example_fragment); 
fragment.specific_function_name(); 

または

2)

ExampleFragment fragment = (ExampleFragment) getSupportFragmentManager().findFragmentByTag(“FragTagName”); 
fragment.specific_function_name(); 

1
私はR.id.example_fragmentというIDを持つCoordinatorLayoutを持っていますが、nullを返します。import android.support.v4.app.Fragmentを使用しています。何をすべきか?
Kishore 2016年

これを新しい質問として投稿し、サンプルコードを含めることをお勧めします。実際のコードを見ずに問題の原因を特定することは困難です。
Gene

9

サポートライブラリを使用している場合は、次のようにする必要があります。

FragmentManager manager = getSupportFragmentManager();
Fragment fragment = manager.findFragmentById(R.id.my_fragment);
fragment.myMethod();

4
  1. サポートライブラリFragmentを使用していない場合は、次の操作を行います。

((FragmentName) getFragmentManager().findFragmentById(R.id.fragment_id)).methodName();


2.サポートライブラリFragmentを使用している場合は、次の操作を行います。

((FragmentName) getSupportFragmentManager().findFragmentById(R.id.fragment_id)).methodName();


3

フラグメントのメソッドを呼び出す前にフラグメントが追加されているかどうかを確認するのが最善だと思います。null例外を回避するには、このようなことを行います。

ExampleFragment fragment = (ExampleFragment) getFragmentManager().findFragmentById(R.id.example_fragment);
if(fragment.isAdded()){
  fragment.<specific_function_name>(); 
}

2

フラグメントからアクティビティへ:

((YourActivityClassName)getActivity()).yourPublicMethod();

アクティビティからフラグメントへ:

FragmentManager fm = getSupportFragmentManager();

//if you added fragment via layout xml
YourFragmentClass fragment = 
(YourFragmentClass)fm.findFragmentById(R.id.your_fragment_id);
fragment.yourPublicMethod();

コードを介してフラグメントを追加し、フラグメントを追加するときにタグ文字列を使用した場合は、代わりにfindFragmentByTagを使用します。

YourFragmentClass fragment = (YourFragmentClass)fm.findFragmentByTag("yourTag");

1

まず、fragment好きな方法でメソッドを作成します

public void name()
{


}

あなたの activityあなたはこれを追加

onCreate()メソッドを追加

myfragment fragment=new myfragment()

最後に、呼び出したいメソッドを呼び出し、これを追加します

fragment.method_name();

このコードを試してください


1
FragmentManager fm = getFragmentManager(); 
MainFragment frag = (MainFragment)fm.findFragmentById(R.id.main_fragment); 
frag.<specific_function_name>(); 

1

についてはわかりませんJavaが、C#(Xamarin.Android)では、メソッドを呼び出す必要があるたびにフラグメントを検索する必要はありません。以下を参照してください:

public class BrandActivity : Activity
{
    MyFragment myFragment;

    protected override void OnCreate(Bundle bundle)
    {       
        // ...
        myFragment = new MyFragment();      
        // ...
    }

    void someMethod()
    {
        myFragment.MyPublicMethod();
    }
}

public class MyFragment : Android.Support.V4.App.Fragment
{
    public override void OnCreate(Bundle bundle)
    {
        // ...
    }

    public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle bundle)
    {
        // ...
    }

    public void MyPublicMethod()
    {
        // ...
    }   
}

Javaあなたにも同じことができると思います。


1

また、次のようなインターフェイスを使用してフラグメントメソッドを呼び出します

まず、インターフェースを作成します

public interface InterfaceName {
    void methodName();
}

インターフェースを作成した後、フラグメントにインターフェースを実装します

MyFragment extends Fragment implements InterfaceName {
    @overide
    void methodName() {

    }
}

そして、あなたはあなたの活動にインターフェースの参照を作成します

class Activityname extends AppCompatActivity {
    Button click;
    MyFragment fragment;

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity);

        click = findViewById(R.id.button);

        fragment = new MyFragment();

        click.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
               fragment.methodName();
            }
        });
    }
}

0
((HomesFragment)getSupportFragmentManager().findFragmentById(R.id.fragment_container)).filterValidation();
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.