2015-08-23 4 views
1

У меня есть основной вид деятельности, и я хочу, чтобы вызвать метод внутри фрагмента я использую getSupportFragmentManager для фрагмента получить, но всегда возвращают нуль ко мне вы можете мне помочь, пожалуйста,Как я могу назвать метод в фрагменте из активности?

mainActivity:

import android.content.Intent; 
import android.support.v4.app.FragmentManager; 
import android.support.v7.app.ActionBarActivity; 

public class MainActivity extends ActionBarActivity implements OnItemPressListener { 

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


    } 
    public void A() 
    { 
     FragmentManager fragManager = this.getSupportFragmentManager(); 
     MainFragment fragment= (MainFragment)fragManager.findFragmentById(R.id.mainfragment);///always Null 
     fragment.B(); 
    }. 
} 

main_fragment:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:id="@+id/mainfragment" 
    tools:context=".mainFragment"> 
    <GridView 
     android:id="@+id/gridview_movie" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent"></GridView> 
</FrameLayout> 

MainFragmet:

import android.support.v4.app.Fragment;; 

public class MainFragment extends Fragment { 
public void B() { 
///do some thing 
} 
} 
+1

фрагмент на самом деле загружается в 'R.id. mainfragment'? В вашем «MainActivity» нет кода, который подсказывает вам. – PPartisan

ответ

1

вам просто нужно, чтобы получить экземпляр из фрагмента внутри основной деятельности

MainFragment fragment=new MainFragment(); 
0

Я не вижу какой-либо код в ваш вопрос, который предполагает вы когда-нибудь экземпляр Fragment и загрузить его в R.id.mainfragment. Кроме того, ваш файл main_fragment.xml содержит GridView с параметрами match_parent. Это бессмысленно, если вы намереваетесь загрузить фрагмент в R.id.mainfragment, так как ваш GridView только затмит его.

Имея это в виду, я внесу следующие исправления в ваш код.

  1. Удалите GridView из файла layout:

    <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
        xmlns:tools="http://schemas.android.com/tools" 
        android:layout_width="fill_parent" 
        android:layout_height="fill_parent" 
        android:id="@+id/mainfragment" 
        tools:context=".mainFragment" /> 
    
  2. Добавить что-то вроде следующего к вашему onCreate() в MainActivity:

    if(getSupportFragmentManager.findFragmentById(R.id.mainfragment) == null) { 
        getSupportFragmentManager() 
         .beginTransaction 
         .add(R.id.mainfragment, new MainFragment()) 
         .commit(); 
    } 
    
    //...This can be in onCreate(), or inside a method, to access MainFragment's methods 
    MainFragment frag = (MainFragment) getSupportFragmentManager().findFragmentById(R.id.mainfragment); 
    if (frag != null) frag.callYourMethodHere(); 
    
+0

Где я могу поставить gridView Если я удалю из main_fragment –

+0

@mohammadtofi Это зависит от его назначения, но я сразу подумал, что он должен быть частью макета вашего фрагмента, если вы хотите, чтобы он занимал весь экран. – PPartisan

0

Если вы хотите использовать findFragmentById. .. Вы должны написать вот так:

<fragment 
    android:id="@+id/mainfragment" 
    class="com.oldfeel.base.BaseFragment" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" /> 
+0

findFragmentById() также может использоваться с динамическими фрагментами, а не только для статических фрагментов. – PPartisan

0

Сначала вы не создать экземпляр фрагмента в основной деятельности попробовать код ниже:

/** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.news_articles); 

     // Check whether the activity is using the layout version with 
     // the fragment_container FrameLayout. If so, we must add the first fragment 
     if (findViewById(R.id.fragment_container) != null) { 

      // However, if we're being restored from a previous state, 
      // then we don't need to do anything and should return or else 
      // we could end up with overlapping fragments. 
      if (savedInstanceState != null) { 
       return; 
      } 

      // Create an instance of ExampleFragment 
      HeadlinesFragment firstFragment = new HeadlinesFragment(); 

      // In case this activity was started with special instructions from an Intent, 
      // pass the Intent's extras to the fragment as arguments 
      firstFragment.setArguments(getIntent().getExtras()); 

      // Add the fragment to the 'fragment_container' FrameLayout 
      getSupportFragmentManager().beginTransaction() 
        .add(R.id.fragment_container, firstFragment, "myAwesonFragment").commit(); 
     } 
    } 

тогда, если ваш метод А сделать следующее

public void A() 
    { 
     BrowseFragment fragment = (BrowseFragment) getSupportFragmentManager().findFragmentByTag("myAwesonFragment"); 
     //Check if the Bottom Sheet is Expanded 
     fragment.B(); 
    } 

И вот именно это время не будет равно нулю. Я лично всегда использую findFragmentByTag, когда хочу найти фрагмент.

PD: мы использовали getSupportFragmentManager(), потому что вы используете android.support.v4.app.Fragment, если вы используете android.app.Fragment использовать getFragmentManager()

Смежные вопросы