Android如何访问片段中的元素?

时间:2016-06-23 14:14:57

标签: android android-fragments

我有一个活动可以加载2个不同的片段,并在需要时在它们之间切换。问题是我无法访问片段中的任何元素。我需要能够在工具栏中设置字体和文本,以及能够设置复选框。

片段XML:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:weightSum="3">

<include
    layout="@layout/toolbar_main"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"/>

<CheckBox
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_margin="15dp"
    android:id="@+id/cycle_button"
    android:button="@null"
    android:background="@drawable/cycle"
    android:layout_weight="1"
    android:layout_gravity="center_vertical" />

<CheckBox
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_margin="15dp"
    android:id="@+id/walk_button"
    android:button="@null"
    android:background="@drawable/walk"
    android:layout_weight="1"
    android:layout_gravity="center_vertical" />

java文件:

 protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    getSupportActionBar().setDisplayShowTitleEnabled(false);

    TextView appTitle = (TextView) toolbar.findViewById(R.id.toolbar_title);
    appTitle.setText("title");

    CheckBox cycle = (CheckBox) getView().findViewById(R.id.cycle_button);
    CheckBox walk = (CheckBox) findViewById(R.id.walk_button);
}

findViewById对片段不起作用,它只是保持返回null。

3 个答案:

答案 0 :(得分:1)

您可以在实例化时将活动元素的所需值发送到片段。

但是您可以选择几种方法在您的活动和片段之间进行通信:  因此,请查看指南Communicating with Fragments

  

1。)Bundle - Activity可以构造一个片段并设置参数

     

2.)方法 - Activity可以调用片段实例上的方法

     

3。)监听器 - 片段可以通过接口

触发活动上的监听器事件

特别是 Fragment with Arguments 会对您有所帮助:

  

在某些情况下,您的片段可能希望接受某些参数。   一种常见的模式是创建一个静态newInstance方法来创建   带参数的片段。这是因为片段必须只有一个   没有参数的构造函数。相反,我们想要使用   setArguments方法如:

public class DemoFragment extends Fragment {
    // Creates a new fragment given an int and title
    // DemoFragment.newInstance(5, "Hello");
    public static DemoFragment newInstance(int someInt, String someTitle) {
        DemoFragment fragmentDemo = new DemoFragment();
        Bundle args = new Bundle();
        args.putInt("someInt", someInt);
        args.putString("someTitle", someTitle);
        fragmentDemo.setArguments(args);
        return fragmentDemo;
    }
}
  

这会将某些参数设置到片段中,以便以后访问&gt;的onCreate。您可以稍后使用以下命令访问参数:

public class DemoFragment extends Fragment {
   @Override
   public void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       // Get back arguments
       int SomeInt = getArguments().getInt("someInt", 0);   
       String someTitle = getArguments().getString("someTitle", "");    
   }
}
  

现在我们可以在Activity中动态加载片段:

// Within the activity
FragmentTransaction ft =     getSupportFragmentManager().beginTransaction();
DemoFragment fragmentDemo = DemoFragment.newInstance(5, "my title");
ft.replace(R.id.your_placeholder, fragmentDemo);
ft.commit();
  

这种模式使得为初始化的片段传递参数相当简单。

在实例化片段之后,您可以继续在膨胀期间从片段的布局中检索所需的视图,并设置片段参数中包含的值。

public class DemoFragment extends Fragment {
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        final View view =  inflater.inflate(R.layout.your_fragment_layout, container, false);

        // Retrieve views here via findElementById etc.. and set the attributes from the fragment's arguments

        return view;
    }
}

答案 1 :(得分:0)

在片段中:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle avedInstanceState) {
   View rootView = inflater.inflate(R.layout.yourlayout, null);
   Toolbar toolbar = (Toolbar) rootView.findViewById(R.id.toolbar);
   //...[other views get here]...
   return rootView;
}

答案 2 :(得分:0)

在片段视图中,创建是在.onCreateView()方法中完成的。 您可以使用ViewHolder模式保存对所有视图的引用,以便将来访问它们。 如果要从片段访问活动,请在片段中定义接口并在活动中实现它,这样您就可以进行如下调用:  ((MyInterface)getActivity())。changeToolbar()

为了在创建fragement时将值传递给fragment使用静态方法。请记住,数据使用传递必须实现Parceleable接口