我有一个活动可以加载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。
答案 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接口