Android 无法使onClick在片段中工作

Android 无法使onClick在片段中工作,android,android-fragments,android-preferences,Android,Android Fragments,Android Preferences,说到碎片,我是个初学者。我已经浏览了几乎所有关于在片段中使用onClick的Stackoverflow问题/anwser,但是由于某种原因,我的onClick根本没有被触发 我有一个管理员活动,它加载一个设置片段,该片段扩展了首选片段 AdminActivity.java @覆盖 创建时受保护的void(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.admin); g

说到碎片,我是个初学者。我已经浏览了几乎所有关于在片段中使用onClick的Stackoverflow问题/anwser,但是由于某种原因,我的onClick根本没有被触发

我有一个
管理员活动
,它加载一个
设置片段
,该片段扩展了
首选片段

AdminActivity.java

@覆盖
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.admin);
getFragmentManager().beginTransaction()
.replace(R.id.settings\u片段,新设置片段())
.commit();
}
admin.xml


设置片段
以编程方式加载首选项XML布局,其中一个布局包含一个
首选项屏幕
,该屏幕具有一个
首选项
,布局设置为另一个片段:


现在加载一个新的
PreferenceFragment
,它允许更新应用程序(这是一个ITN分发的应用程序,不会上载到Play Store)

公共类SettingsUpdateFragment扩展片段实现View.OnClickListener
私有文本视图更新状态;
私有进程栏更新进程;
私有按钮更新;
私有文本视图最新更新;
onCreateView
中,我定义了布局中变量的视图,并使用
OnClickListener设置了按钮

@覆盖
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState){
视图=充气机。充气(R.layout.settings\u update\u片段,容器,false);
updateStatus=(TextView)view.findViewById(R.id.updateStatus);
updateProgress=(ProgressBar)view.findViewById(R.id.updateProgress);
updateAction=(按钮)view.findViewById(R.id.updateAction);
lastUpdated=(TextView)view.findViewById(R.id.lastUpdated);
Iconnify.addIcons(updateAction);
setOnClickListener(这个);
返回视图;
}
onClick
取自
视图。OnClickListener
实现
setingsupdatefragment

@覆盖
公共void onClick(视图){
如果(更新){
d(标记“updateAction TriggeredforDownloadAndInstall()”;
下载并安装();
}否则{
Log.d(标记“为checkForUpdates()触发的updateAction”);
checkForUpdates();
}
}
由于某种原因,onClick从未被触发
hasUpdates
默认为
false
,因此至少应触发
checkForUpdates()
方法

我还尝试为内联按钮创建
视图.OnClickListener

updateAction.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
如果(更新){
d(标记“updateAction TriggeredforDownloadAndInstall()”;
下载并安装();
}否则{
Log.d(标记“为checkForUpdates()触发的updateAction”);
checkForUpdates();
}
}
});
但这并不奏效

我忽略了什么吗?我如何实现
PreferenceFragment
是出了什么问题还是其他问题

更新

在使用
Log
进行一些调试之后,我发现
片段甚至没有被创建

次要更新

我感觉XML中的
首选项
只识别
android:layout
,而不是
android:fragment
。我尝试删除
布局
,只保留在
片段
中,然后它不显示在
设置SupdateFragment::onCreateView()中定义的布局

我在
片段
s
onCreate()
中添加了一个调试日志条目,并且日志行从未显示过。因此,问题似乎是
片段
没有从
首选项
加载。但是为什么呢?

“…扩展了
首选片段”
…”

view = inflater.inflate(R.layout.settings_update_fragment, container, false); 
这看起来有点不对劲。如果它不是首选项片段,请不要将其扩展为首选项片段。或者使用
addPreferencesFromResource(R.xml.preferences)


可能不是问题,但看起来仍然可疑。

您的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>

为了使
首选项的属性
android:fragment
有效,您的托管活动必须实现


1.从所有视图2的映射中删除try、catch块。什么是图标化?@avishedas是一个在android应用程序中集成图标的库。我删除了try/catch块,但没有效果,但是我发现
片段本身甚至没有被加载。请检查更新的问题。现在用这种方式尝试updateAction.setOnClickListener(新OnClickListener(){@Override public void onClick(视图arg0){//TODO自动生成的方法存根Toast.makeText(getBaseContext(),“单击图像”,Toast.LENGTH_SHORT.show();});并从中删除OnclickListnerimplements@AvishekDas我觉得问题可能出在
片段中
根本没有加载。出于某种原因,我的XML中的
首选项
忽略了
片段
属性,而只识别
布局
属性。我通过删除
android:layout
进行测试,在
setingsupdatefragment::onCreateView()中定义的布局不显示。我还将此信息添加到了问题中。Oo您必须使用FrameLayout。实际上,我只是扩展了
片段
认为这可能是问题所在,但不幸的是,这没有对它产生任何影响。
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;
    }
...