如何在片段的父Activity中访问Fragment的子视图?

use*_*796 66 android android-layout

我有一个受支持的片段活动,它将加载diff片段.片段有一些textView,id = "score"我希望得到它的句柄,但findViewById得分的textView返回null.为什么这样?


textView放在片段中

public class MyActivity extends  extends ActionBarActivity
        implements NavigationDrawerFragment.NavigationDrawerCallbacks{

   private TextView scoreBoardTextView = null;

   protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
     setContentView(R.layout.activity_home);
     mNavigationDrawerFragment = (NavigationDrawerFragment)
                getSupportFragmentManager().findFragmentById(R.id.navigation_drawer);
     scoreBoardTextView = (TextView) findViewById(R.id.score); //this returns null
  }

    @Override
    public void onNavigationDrawerItemSelected(int position) {
      //set fragment    
    }

}
Run Code Online (Sandbox Code Playgroud)

SMR*_*SMR 64

注意:

直接访问片段外的片段视图不是一个好主意.您应该使用片段回调接口来处理此类情况并避免错误.以下方式有效但不建议使用,因为这不是一个好习惯.


如果你想访问其父级内部的那个TextView,那么你应该在你的类中定义一个方法,如下所示:FragmentActivityFragment

public class MyFragment extends Fragment {

    TextView mTextView;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.activity_main, container, false);
        mTextView = (TextView) view.findViewById(R.id.textView1);
        return view;
    }

    public void setTextViewText(String value){
        mTextView.setText(value);
    }


}
Run Code Online (Sandbox Code Playgroud)

现在你可以在这里使用Activity这个:

myFragment.setTextViewText("foo");
Run Code Online (Sandbox Code Playgroud)

这里myFragment属于类型MyFragment.

如果你想访问整个,TextView那么你可以在里面定义一个这样的方法MyFragment.java:

public TextView getTextView1(){
    return mTextView;
}
Run Code Online (Sandbox Code Playgroud)

通过这个你可以访问TextView自己.

希望这可以帮助.:)

  • 这看起来是一个很好的答案,但我认为覆盖show的方法是`onCreateView()`而不是`getView()`. (2认同)
  • 您可以通过某种方式实现该片段,使其能够告诉您特定视图是否可见。它干净得多。Fragment 负责视图,Activity 使用该 Fragment 提供的接口来获取视图的信息。没有直接访问。 (2认同)

Ars*_*ood 22

可以通过以下方式:

在片段中保持对膨胀视图的引用,如下所示:

public class MyFragment extends SherlockFragment{

MainMenuActivity activity;
public View view;
public MyFragment(){
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    if ( getActivity() instanceof MainMenuActivity){
        activity = (MainMenuActivity) getActivity();
    }

    view = inflater.inflate(R.layout.aboutus, container, false);        
    return view;
}

}
Run Code Online (Sandbox Code Playgroud)

在Activity中创建一个函数,如下所示:

 public class MainMenuActivity extends SherlockFragmentActivity {

 SherlockFragment fragment = null;

 public void switchContent(SherlockFragment fragment) {     
    this.fragment = fragment;
    getSupportFragmentManager()
    .beginTransaction()
    .replace(R.id.mainmenu, fragment)
    .commit();

    invalidateOptionsMenu();
}
Run Code Online (Sandbox Code Playgroud)

其目的是保持对当前片段的引用.每当你想切换片段时,你都会调用上面的函数,就像这样(来自片段):

activity.switchContent( new MyFragment_2());
Run Code Online (Sandbox Code Playgroud)

现在你有了当前的片段引用.所以你可以直接在Activity中访问Fragment的视图,如下所示:this.fragment.view


Ali*_*ran 12

您无需引用Fragment视图即可在Activity中获取其组件.因为您可以在父Activity中直接访问Fragment的布局组件.

只需您可以访问任何组件

findViewById(R.id.child_of_fragment_layout);  
Run Code Online (Sandbox Code Playgroud)

  • 确实有一个警告(至少对我而言),片段视图可能还没有准备好。当我将该代码移动到我的活动的 `onStart()` 时它起作用了 (3认同)

Sam*_*ari 5

您可以使用 Fragment 类的 getView 方法访问。

例如,您的 MyFragment 中有一个 ID 为“text_view”的 TextView
在您的 Activity 中创建一个 Fragment of Yours:

MyFragment myFragment = new MyFragment();
Run Code Online (Sandbox Code Playgroud)

当您需要孩子时,只需调用 getView,然后找到您的 childView。

View view = myFragment.getView();
if (view !=null) {
view.findViewById(R.id.text_view).setText("Child Accessed :D");
}
Run Code Online (Sandbox Code Playgroud)

注意:如果您想要片段的根视图,那么myFragment.getView();就足够了。


小智 5

为了访问 TextView 或 Button 或片段中的任何内容,您需要执行以下操作:

public class BlankFragment extends Fragment {
public View view;
public TextView textView;
public Button button;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    view =inflater.inflate(R.layout.fragment_blank, container, false);
    textView = (TextView)view.getRootView().findViewById(R.id.textView_fragment1);
    return view;
}

public void changeTextOfFragment(String text){
    textView.setText(text);
    view.setBackgroundResource(R.color.colorPrimaryDark);
}
Run Code Online (Sandbox Code Playgroud)

一旦在 MainActivity 或任何其他要从 Fragment 访问 TextView 的地方完成此操作,您应该确保在 OnCreate() 方法中以其他方式设置片段,它很可能会抛出 nullPointer。因此,您要更改 TextView 的活动应如下所示:

public class MainActivity extends AppCompatActivity {
private Button button1;
private FragmentManager fragmentManager;
private FragmentTransaction fragmentTransaction;
BlankFragment blankFragment = new BlankFragment();

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

    fragmentManager = getFragmentManager();
    fragmentTransaction = fragmentManager.beginTransaction();
    fragmentTransaction.replace(R.id.fragment1,blankFragment);
    fragmentTransaction.commit();
}

private void changeFragment(){
    button1.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            blankFragment.changeTextOfFragment("Enter here the text which you want to be displayed on your Updated Fragment");

        }
    });
}
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助 :)


小智 0

分数textView在fragment的布局中,它不在MyActivity的布局中,即R.layout.activity_home。因此,一旦您膨胀相应的布局文件,您就可以在该片段中找到乐谱文本视图。