无法在Fragment中使用onClick工作

时间:2015-03-27 08:36:17

标签: android android-fragments android-preferences

我是片段的初学者。我已经查看了几乎所有关于使用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加载。但为什么呢?

3 个答案:

答案 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;
    }
...