我是片段的初学者。我已经查看了几乎所有关于使用onClick内部片段的Stackoverflow问题/ anwsers,但由于某种原因我的onClick根本没有被触发。
我有一个AdminActivity
加载了SettingsFragment
,扩展了PreferenceFragment
。
AdminActivity.java
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.admin);
getFragmentManager().beginTransaction()
.replace(R.id.settings_fragment, new SettingsFragment())
.commit();
}
admin.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">
<fragment android:layout_width="match_parent" android:layout_height="match_parent"
android:name="{package_name}.SettingsFragment" android:id="@+id/settings_fragment"
class="{package_name}.SettingsFragment"/>
</LinearLayout>
SettingsFragment
以编程方式加载首选项XML布局,其中一个布局包含PrefernceScreen
,其Preference
的布局设置为另一个片段:
<PreferenceScreen
android:key="button_app_updates"
android:title="App updates"
android:persistent="false">
<Preference
android:fragment="{package_name}.SettingsUpdateFragment"
android:layout="@layout/settings_update_fragment" />
</PreferenceScreen>
现在加载一个新的PreferenceFragment
,允许更新应用程序(这是一个不会上传到Play商店的itnernally分布式应用程序)
public class SettingsUpdateFragment extends Fragment implements View.OnClickListener
private TextView updateStatus;
private ProgressBar updateProgress;
private Button updateAction;
private TextView lastUpdated;
在onCreateView
中,我从布局中定义变量的视图,并使用OnClickListener
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
view = inflater.inflate(R.layout.settings_update_fragment, container, false);
updateStatus = (TextView) view.findViewById(R.id.updateStatus);
updateProgress = (ProgressBar) view.findViewById(R.id.updateProgress);
updateAction = (Button) view.findViewById(R.id.updateAction);
lastUpdated = (TextView) view.findViewById(R.id.lastUpdated);
Iconify.addIcons(updateAction);
updateAction.setOnClickListener(this);
return view;
}
onClick
取自View.OnClickListener
SettingsUpdateFragment
实施
@Override
public void onClick(View view){
if(hasUpdates){
Log.d(TAG, "updateAction triggered for downloadAndInstall()");
downloadAndInstall();
} else {
Log.d(TAG, "updateAction triggered for checkForUpdates()");
checkForUpdates();
}
}
出于某种原因,onClick永远不会被触发。 hasUpdates
默认为false
,因此应触发至少checkForUpdates()
方法。
我还尝试为内联按钮创建View.OnClickListener
updateAction.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(hasUpdates){
Log.d(TAG, "updateAction triggered for downloadAndInstall()");
downloadAndInstall();
} else {
Log.d(TAG, "updateAction triggered for checkForUpdates()");
checkForUpdates();
}
}
});
但这并没有奏效。
我忽略了什么吗?我是如何实施PreferenceFragment
或其他什么的?
更新
在使用Log
进行一些调试后,我发现Fragment
甚至没有被创建。
次要更新
我感觉我的XML中的Preference
只识别android:layout
而不是android:fragment
。我尝试删除layout
,只留在fragment
中,然后它不会显示SettingsUpdateFragment::onCreateView()
中定义的布局。
我在Fragment
onCreate()
添加了一个调试日志条目,并且日志行没有显示出来。所以问题似乎是Fragment
没有从Preference
加载。但为什么呢?
答案 0 :(得分:0)
&#34; ....扩展PreferenceFragment
....&#34;
和
view = inflater.inflate(R.layout.settings_update_fragment, container, false);
这看起来不太对劲。如果它不是首选项片段,请不要将其作为首选项片段进行扩展。或使用addPreferencesFromResource(R.xml.preferences);
。
可能不是问题,但仍然看起来很可疑。
答案 1 :(得分:0)
您的admin.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">
<FrameLayout
android:id="@+id/settings_fragment"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
答案 2 :(得分:0)
为了使android:fragment
代码的属性Preference
有效,您的托管活动必须实施PreferenceFragment.OnPreferenceStartFragmentCallback
class AdminActivity extends Activity
implements PreferenceFragment.OnPreferenceStartFragmentCallback
{
@Override
public boolean onPreferenceStartFragment(PreferenceFragment caller, Preference pref)
{
try
{
Fragment f = (Fragment) Class.forName(pref.getFragment()).getConstructor().newInstance();
getFragmentManager().beginTransaction().replace(R.id.settings_fragment, f).addToBackStack(null).commit();
return true;
}
catch (Exception e)
{
e.printStackTrace();
}
return false;
}
...