【问题标题】:Launch new activity from PreferenceActivity从 PreferenceActivity 启动新活动
【发布时间】:2011-10-25 20:36:37
【问题描述】:

朋友们,美好的一天。 我有一个 PreferenceActivity,它是从 XML 文件中填充的。 当我们按下一个项目时,我们应该启动新的活动。怎么做?我应该在 XML 文件或 Java 类中写什么?

【问题讨论】:

    标签: android android-activity android-preferences preferenceactivity


    【解决方案1】:

    您必须在要启动活动的视图中注册一个 onClickListener。然后,在此方法中,您只需要使用意图调用活动即可。像这样的:

    Intent intent = new Intent(this, ActivityToLaunch.class);
    
    // Start boardgame
    startActivity(intent);
    

    【讨论】:

      【解决方案2】:

      使用添加首选项后

      addPreferencesFromResource(R.xml.preferences);
      

      找到您想要设置 onClick 的首选项

      findPreference("foo_bar_pref");
      

      并通过强制转换来定义它

      Preference fooBarPref = (Preference) findPreference("foo_bar_pref");
      

      然后你可以很容易地设置它的 onClick 使用

      fooBarPref.setOnPreferenceClickListener (new OnPreferenceClickListener()){...}
      

      您可以在该侦听器中启动新的 Activity(使用 Intent)。

      【讨论】:

      • 欢迎您。 :) 我想你应该投票并检查问题是否已回答。
      • 我是新手,这些选项在哪里? (我已检查您的答案是否有用)。
      • Gradle 用户,如果您在 build.gradle 中声明了 applicationId,我的解决方案可能会对您有所帮助! stackoverflow.com/a/27053915/499125
      • 注意!确保您还有“import android.preference.Preference.OnPreferenceClickListener;”否则尝试设置其 onClickListener 将不起作用:)
      【解决方案3】:

      这是动态添加首选项的好教程...稍后您必须自定义自己的方式。

      在 XML 中:

      <Preference  android:key="key" android:title="See Android Market"></Preference>
      

      在 Java 类中:

      Preferences preferences=findPreference("key");
                     preferences.setIntent(new Intent(Intent.ACTION_VIEW,Uri.parse("https://market.android.com/")));
      

      import android.content.Context;
      import android.content.Intent;
      import android.net.Uri;
      import android.os.Bundle;
      import android.preference.CheckBoxPreference;
      import android.preference.DialogPreference;
      import android.preference.Preference;
      import android.preference.PreferenceActivity;
      import android.preference.PreferenceCategory;
      import android.preference.PreferenceScreen;
      import android.widget.LinearLayout;
      import android.widget.ListView;
      
      public class SettingsActivity extends PreferenceActivity {
      
      @Override
      protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          /* Some initializations */
          LinearLayout layout = new LinearLayout(this);
          layout.setOrientation(LinearLayout.VERTICAL);
      
          ListView listView = new ListView(this);
          listView.setId(android.R.id.list);
          listView.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT,LinearLayout.LayoutParams.WRAP_CONTENT, 1));
          layout.addView(listView);
      
          this.setContentView(layout);
          /* Preferences time! (we build the preferences) */
          Preference version = getPreference("My School Manager", "Version 2.0",null);
          Preference author = getPreference("Author", "Balu", null);
          Preference marketLink = getPreference("Android market","View all my apps :)",new Intent(Intent.ACTION_VIEW, Uri.parse("http://market.android.com/")));
      
          CheckBoxPreference check = new CheckBoxPreference(this);
          check.setTitle("Checkbox");
          check.setSummary("Example of checkbox");
          DialogPreference license = new MyDialogPreference(this, "License","This is the license for...bla bla");
      
          /* Now we add the preferences to the preference screen */
          PreferenceScreen preferenceScreen = this.getPreferenceManager()
                  .createPreferenceScreen(this);
          addPreferenceCategory(preferenceScreen, "Preferences Tutorial",version, author, marketLink, check, license);
          this.setPreferenceScreen(preferenceScreen);
      }
      private boolean addPreferenceCategory(PreferenceScreen preferenceScreen,
              String titleCategory, Preference... preferences) {
          boolean addPreference = false;
          for (Preference preference : preferences) {
              if (preference != null)
                  addPreference = true;
          }
          if (addPreference) {
              PreferenceCategory preferenceCategory = new PreferenceCategory(this);
              preferenceCategory.setTitle(titleCategory);
              preferenceScreen.addPreference(preferenceCategory);
              for (Preference preference : preferences) {
                  if (preference != null)
                      preferenceCategory.addPreference(preference);
              }
              return true;
          } else
              return false;
      }
      private Preference getPreference(String title, String summary, Intent intent) {
          Preference pref = new Preference(this);
          pref.setTitle(title);
          pref.setSummary(summary);
          if (intent != null)
              pref.setIntent(intent);
          return pref;
      }
      
      public class MyDialogPreference extends DialogPreference {
          public MyDialogPreference(Context context, String title, String text) {
              super(context, null);
              this.setTitle(title);
              this.setDialogMessage(text);
          }
      }
      

      }

      【讨论】:

      • 我更喜欢第一个选项而不是接受的答案,因为它更简洁地使用首选项上的“setIntent”。
      【解决方案4】:

      鉴于您使用的是 xml 首选项,您可以将代码直接添加到 xml 中:

      <Preference
          android:title="Some Title"
          android:summary="Some Description">
      
          <intent 
              android:action="android.intent.action.VIEW"
              android:targetPackage="com.package.name"
              android:targetClass="com.package.name.ActivityName"
          />
      
      </Preference>
      

      【讨论】:

      • 对于那些在尝试在首选项中启动他们的活动后在这里获得ActivityNotFoundException 的人,您可能像我一样不正确地使用子包名称。如果是这种情况,请仅使用 targetClass 部分中的子包。 &lt;intent android:action="android.intent.action.VIEW" android:targetPackage="com.package.name" android:targetClass="com.package.name.subpackage.ActivityName" /&gt;
      • 可能会为一些人省去痛苦:您可以在 内的 XML 标记中定义类别和额外数据,但您不能使用 XML 设置意图标志。如果要设置标志,则需要注册一个 OnPreferenceClickListener 并手动启动 Intent。
      • Gradle 用户,如果您在 build.gradle 中声明了 applicationId,我的解决方案可能会对您有所帮助! stackoverflow.com/a/27053915/499125
      【解决方案5】:

      Gradle 建设者,看这里!

      如果您使用 gradle over ant 作为构建工具,并且在 android 中声明了 applicationId

      [build.gradle]:
      
      android {
          defaultConfig {
              ...
              applicationId "com.overriding.package.name"
          }
          ...
      }
      

      这将覆盖您在AndroidManifest.xmlandroid:package 中声明的任何值作为您应用的唯一标识符!

      [AndroidManifest.xml]
      
      <manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.my.package">
          <activity android:name=".settings.MyActivity"/>
      </manifest>
      

      &lt;intent&gt; 必须同时考虑两个包名!

      <Preference
          android:title="Some Title"
          android:summary="Some Description">
      
          <intent 
              android:targetPackage="com.overriding.package.name"
              android:targetClass="com.my.package.settings.MyActivity/>
      </Preference>
      

      【讨论】:

      • 您,先生,应该得到这个星球能够产生的每一升爱。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-25
      • 1970-01-01
      • 1970-01-01
      • 2023-03-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多