Question

I keep getting an error that has to do with the preferences and I know it has depreciated so I looked here for help http://developer.android.com/reference/android/preference/PreferenceFragment.html

and I did exactly as it says on the bottom part...

Here is the error:

12-04 00:39:37.553: E/AndroidRuntime(1164): FATAL EXCEPTION: main
12-04 00:39:37.553: E/AndroidRuntime(1164): Process: com.proteintracker, PID: 1164
12-04 00:39:37.553: E/AndroidRuntime(1164): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.proteintracker/com.proteintracker.MainPreferenceActivity}: java.lang.ClassCastException: com.proteintracker.MainPreferenceActivity cannot be cast to android.app.Activity
12-04 00:39:37.553: E/AndroidRuntime(1164):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2102)
12-04 00:39:37.553: E/AndroidRuntime(1164):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2226)
12-04 00:39:37.553: E/AndroidRuntime(1164):     at android.app.ActivityThread.access$700(ActivityThread.java:135)
12-04 00:39:37.553: E/AndroidRuntime(1164):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1397)
12-04 00:39:37.553: E/AndroidRuntime(1164):     at android.os.Handler.dispatchMessage(Handler.java:102)
12-04 00:39:37.553: E/AndroidRuntime(1164):     at android.os.Looper.loop(Looper.java:137)
12-04 00:39:37.553: E/AndroidRuntime(1164):     at android.app.ActivityThread.main(ActivityThread.java:4998)
12-04 00:39:37.553: E/AndroidRuntime(1164):     at java.lang.reflect.Method.invokeNative(Native Method)
12-04 00:39:37.553: E/AndroidRuntime(1164):     at java.lang.reflect.Method.invoke(Method.java:515)
12-04 00:39:37.553: E/AndroidRuntime(1164):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:777)
12-04 00:39:37.553: E/AndroidRuntime(1164):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:593)
12-04 00:39:37.553: E/AndroidRuntime(1164):     at dalvik.system.NativeStart.main(Native Method)
12-04 00:39:37.553: E/AndroidRuntime(1164): Caused by: java.lang.ClassCastException: com.proteintracker.MainPreferenceActivity cannot be cast to android.app.Activity
12-04 00:39:37.553: E/AndroidRuntime(1164):     at android.app.Instrumentation.newActivity(Instrumentation.java:1061)
12-04 00:39:37.553: E/AndroidRuntime(1164):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2093)
12-04 00:39:37.553: E/AndroidRuntime(1164):     ... 11 more

Here is my code for the Preference class

    package com.proteintracker;

import android.app.Activity;
import android.os.Bundle;

public class MainPreferenceActivity extends Activity {

      @Override
      public void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
       // Display the fragment as the main content.
          getFragmentManager().beginTransaction()
                  .replace(android.R.id.content, new MainPreferenceFragment())
                  .commit();

      }
}

Here is my code for the preference fragment class:

package com.proteintracker;

import android.os.Bundle;
import android.preference.PreferenceFragment;

public class MainPreferenceFragment extends PreferenceFragment {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // Load the preferences from an XML resource
        addPreferencesFromResource(R.xml.main_preferences);
    }
}

Here is my xml file for it

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" android:orderingFromXml="true">

    <EditTextPreference
        android:dialogMessage="Enter grams"
        android:dialogTitle="Protein Grams"
        android:key="gramsPerDay"
        android:title="Grams per day" />

</PreferenceScreen>

and here is the manifest file:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.proteintracker"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="11"
        android:targetSdkVersion="18" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        >
        <activity android:name="MainActivity"><intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter></activity><activity
            android:name="MainPreferenceActivity"
            android:label="@string/app_name" >
        </activity>
        <activity android:name="HelpActivity"></activity>

    </application>

</manifest>

EDIT---

Here is my main activity file:

package com.proteintracker;

import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class MainActivity extends Activity {

    private OnClickListener buttonListener = new OnClickListener() {

        @Override
        public void onClick(View v) {
            EditText editText = (EditText)findViewById(R.id.editText1);
            Log.d("ProteinTracker", editText.getText().toString());
        }
    };
    private OnClickListener helpButtonListener = new OnClickListener() {

        @Override
        public void onClick(View v) {

            SharedPreferences preferences = getSharedPreferences("default", MODE_PRIVATE);
            String value = preferences.getString("activityTest", "");
            Log.d("ProteinTracker", value);


            Intent intent = new Intent(MainActivity.this, MainPreferenceActivity.class);
            startActivity(intent);

        }
    };



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        if(savedInstanceState != null) {
            Log.d("ProteinTracker", savedInstanceState.getString("keyName"));
        }
        TextView textView = (TextView) findViewById(R.id.mainActivityTextView);
        textView.setText(R.string.test_updating_a_view);

        Button button = (Button)findViewById(R.id.button1);
        button.setOnClickListener(buttonListener );

        Button helpButton = (Button)findViewById(R.id.helpButton);
        helpButton.setOnClickListener(helpButtonListener );

        SharedPreferences preferences = getSharedPreferences("default", MODE_PRIVATE);
        Editor editor = preferences.edit();
        editor.putString("activityTest", "activity value");
        editor.commit();

    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        outState.putString("keyName","string");
        super.onSaveInstanceState(outState);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {

        MenuInflater menuInflater = getMenuInflater();
        menuInflater.inflate(R.menu.main_menu, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {

        switch(item.getItemId()) {
            case R.id.settingsMenuItem:
                //launch settings activity

            default:
        }

        return super.onOptionsItemSelected(item);
    }



}

I updated the fragment file and added a new one too and also, have included my main activity file.

I am not sure what I need to do, I am new at Java and Android... thanks!

Was it helpful?

Solution

Fragments need to be added to activities. You should change the name of your fragment from MainPreferenceActivity to MainPreferenceFragment, so you'd have:

public class MainPreferenceFragment extends PreferenceFragment {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // Load the preferences from an XML resource
        addPreferencesFromResource(R.xml.main_preferences);
    }
}

and then have MainPreferenceActivity extending Activity, where you add your fragment:

public class MainPreference Activity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // Display the fragment as the main content.
    getFragmentManager().beginTransaction()
            .replace(android.R.id.content, new MainPreferenceFragment())
            .commit();
    }
}

Read more here.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top