我有两个片段:
-扩展Fragment的HomeFragment
-扩展了PreferenceFragment
每个都包含一个TextView
,我希望在Java代码中访问和修改其内容。我通过调用onViewCreated
然后在findViewById
上使用setText
在TextView
内进行此修改。
这对于HomeFragment
来说很好用,但在SettingsFragment
中却不能。
作为参考,在与首选项关联的布局中定义了TextView
的{{1}}。奇怪的是,SettingsFragment
类型的视图层次结构似乎还没有完全准备好!为了进一步讲解,我尝试放置经过一段时间延迟(使用PreferenceFragment
来修改onViewCreated
的代码,并且该代码起作用了!
下面,我放置了测试我刚刚提出的问题所需的所有代码。
MainActivity.java
TextView
HomeFragment.java
postDelay
SettingsFragment.java
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final HomeFragment homeFragment = new HomeFragment();
final SettingsFragment settingsFragment = new SettingsFragment();
getFragmentManager().beginTransaction()
.add(R.id.fragmentContainer, homeFragment).commit();
// Just a simple button to switch between the two fragments
Button button = findViewById(R.id.activityButton);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(homeFragment.isAdded()) {
getFragmentManager().beginTransaction()
.replace(R.id.fragmentContainer, settingsFragment).commit();
} else {
getFragmentManager().beginTransaction()
.replace(R.id.fragmentContainer, homeFragment).commit();
}
}
});
}
}
activity_main.xml
public class HomeFragment extends Fragment {
public HomeFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_home, container, false);
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
TextView textView = view.findViewById(R.id.homeText);
if(textView != null) {
textView.setText("Home fragment text (modified)");
}
}
}
fragment_home.xml
public class SettingsFragment extends PreferenceFragment {
public SettingsFragment() {
// Required empty public constructor
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.fragment_settings);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return super.onCreateView(inflater, container, savedInstanceState);
}
@Override
public void onViewCreated(final View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
// ---- BLOCK 1 -----
TextView textView = view.findViewById(R.id.settingsText);
if (textView != null) {
textView.setText("Preference 1 (modified)");
}
// ---- BLOCK 2 -----
// view.post(new Runnable() {
// @Override
// public void run() {
// TextView textView = view.findViewById(R.id.settingsText);
// if (textView != null) {
// textView.setText("Preference 1 (modified)");
// }
// }
// });
// ---- BLOCK 3 -----
// view.postDelayed(new Runnable() {
// @Override
// public void run() {
// TextView textView = view.findViewById(R.id.settingsText);
// if (textView != null) {
// textView.setText("Preference 1 (modified)");
// }
// }
// }, 100);
}
}
fragment_settings.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:id="@+id/activityText"
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:gravity="center_horizontal"
android:text="MainActivity" />
<Button
android:id="@+id/activityButton"
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@id/activityText"
android:text="Change fragment"/>
<FrameLayout
android:id="@+id/fragmentContainer"
android:layout_width="match_parent"
android:layout_height="0dp"
app:layout_constraintTop_toBottomOf="@id/activityButton"
app:layout_constraintBottom_toBottomOf="parent">
</FrameLayout>
</android.support.constraint.ConstraintLayout>
preference_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto"
tools:context=".HomeFragment">
<TextView
android:id="@+id/homeText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
android:text="Home fragment text" />
</android.support.constraint.ConstraintLayout>
preference_layout_category.xml
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceCategory
android:layout="@layout/preference_layout_category">
<Preference
android:enabled="true"
android:layout="@layout/preference_layout" />
</PreferenceCategory>
</PreferenceScreen>
答案 0 :(得分:1)
前几天我有类似的事情。 在片段的onCreateView中使用findViewById()代替onViewCreated方法。 祝你好运。
答案 1 :(得分:0)
改为在onCreateView()中绑定视图
View view= inflater.inflate(R.layout.your_fragment, container, false);
TextView textView = view.findViewById(R.id.settingsText);
return view;