2016-07-14 91 views
1

在我的主要活动中,我正在检查是否有学生将他们的ID存储在共享首选项中 在onResume中,我检查字符串是否为空,如果是,我会启动一个对话框在活动中启动PreferenceDialog

private void showNoStudentIdDialog() { 
    LayoutInflater inflater = LayoutInflater.from(this); 
    View view = inflater.inflate(R.layout.dialog_no_id, null); 

    AlertDialog.Builder builder = new AlertDialog.Builder(this); 

    builder.setView(view).setTitle(getString(R.string.no_id_dialog_title)); 
    builder.setCancelable(false); 
    builder.setPositiveButton(getString(R.string.ok), new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialog, int which) { 
      dialog.dismiss(); 

      openSettingsDetail(); 
     } 
    }); 
    builder.create().show(); 
} 

openSettingDetail

public boolean openSettingsDetail() { 
    Intent settingsIntent = new Intent(this, SettingsActivity.class); 
    startActivity(settingsIntent); 
    return true; 
} 

意图正确启动我的SettingsActivty并加载正确的偏好。但是,我仍然需要手动触摸ID首选项来启动它的对话框。当我启动该意图时,是否可以通过MainActivity以编程方式实现此触摸/点击?

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:custom="http://schemas.android.com/apk/res/com.mcgowan.timetable.itsligotimetables"> 


<com.mcgowan.timetable.itsligotimetables.StudentIdEditTextPreference 
    android:capitalize="words" 
    android:defaultValue="@string/student_id_default" 
    android:hint="@string/student_id_hint" 
    android:inputType="textCapWords" 
    android:key="@string/student_id_key" 
    android:maxLength="9" 
    custom:minLength="9" 
    android:maxLines="1" 
    android:selectAllOnFocus="true" 
    android:singleLine="true" 
    android:title="@string/pref_title_display_name" /> 


<ListPreference 
    android:defaultValue="@string/pref_timetable_type_classes" 
    android:entries="@array/timetable_type_list_titles" 
    android:entryValues="@array/timetable_type_list_values" 
    android:key="@string/pref_timetable_key" 
    android:title="@string/pref_title_timetable_type" /> 

首先显示该对话框

SettingsActivity

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

    setupActionBar(); 
    addPreferencesFromResource(R.xml.pref_general); 

    bindPreferenceSummaryToValue(findPreference(getString(R.string.student_id_key))); 
    bindPreferenceSummaryToValue(findPreference(getString(R.string.pref_timetable_key))); 

} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    int id = item.getItemId(); 
    if (id == android.R.id.home) { 
     this.finish(); 
     return true; 
    } 
    return super.onOptionsItemSelected(item); 
} 

/** 
* Set up the {@link android.app.ActionBar}, if the API is available. 
*/ 
private void setupActionBar() { 
    ActionBar actionBar = getSupportActionBar(); 
    if (actionBar != null) { 
     // Show the Up button in the action bar. 
     actionBar.setDisplayHomeAsUpEnabled(true); 
     actionBar.setDisplayShowHomeEnabled(true); 
     actionBar.setDisplayShowTitleEnabled(false); 
     actionBar.setIcon(R.drawable.settings); 
    } 
} 


/** 
* {@inheritDoc} 
*/ 
@Override 
public boolean onIsMultiPane() { 
    return isXLargeTablet(this); 
} 

/** 
* Helper method to determine if the device has an extra-large screen. For 
* example, 10" tablets are extra-large. 
*/ 
private static boolean isXLargeTablet(Context context) { 
    return (context.getResources().getConfiguration().screenLayout 
      & Configuration.SCREENLAYOUT_SIZE_MASK) >= Configuration.SCREENLAYOUT_SIZE_XLARGE; 
} 


/** 
* A preference value change listener that updates the preference's summary 
* to reflect its new value. 
*/ 
private static Preference.OnPreferenceChangeListener sBindPreferenceSummaryToValueListener = new Preference.OnPreferenceChangeListener() { 
    @Override 
    public boolean onPreferenceChange(Preference preference, Object value) { 
     String stringValue = value.toString(); 

     if (preference.getKey().equals(preference.getContext().getString(R.string.student_id_key))) { 
      setPreferenceSummary(preference, stringValue); 
     } else if (preference instanceof ListPreference) { 
      // For list preferences, look up the correct display value in 
      // the preference's 'entries' list. 
      ListPreference listPreference = (ListPreference) preference; 
      int index = listPreference.findIndexOfValue(stringValue); 

      // Set the summary to reflect the new value. 
      preference.setSummary(
        index >= 0 
          ? listPreference.getEntries()[index] 
          : null); 

     } else if (preference instanceof RingtonePreference) { 
      // For ringtone preferences, look up the correct display value 
      // using RingtoneManager. 
      if (TextUtils.isEmpty(stringValue)) { 
       // Empty values correspond to 'silent' (no ringtone). 
       preference.setSummary(R.string.pref_ringtone_silent); 

      } else { 
       Ringtone ringtone = RingtoneManager.getRingtone(
         preference.getContext(), Uri.parse(stringValue)); 

       if (ringtone == null) { 
        // Clear the summary if there was a lookup error. 
        preference.setSummary(null); 
       } else { 
        // Set the summary to reflect the new ringtone display 
        // name. 
        String name = ringtone.getTitle(preference.getContext()); 
        preference.setSummary(name); 
       } 
      } 

     } else { 
      // For all other preferences, set the summary to the value's 
      // simple string representation. 
      preference.setSummary(stringValue); 
     } 
     return true; 
    } 
}; 

private static void setPreferenceSummary(Preference preference, Object value) { 
    String stringValue = value.toString(); 
    String key = preference.getKey(); 

    if (preference instanceof ListPreference) { 
     // For list preferences, look up the correct display value in 
     // the preference's 'entries' list (since they have separate labels/values). 
     ListPreference listPreference = (ListPreference) preference; 
     int prefIndex = listPreference.findIndexOfValue(stringValue); 
     if (prefIndex >= 0) { 
      preference.setSummary(listPreference.getEntries()[prefIndex]); 
     } 
    } else if (key.equals(preference.getContext().getString(R.string.student_id_key))) { 
     @TimetableSyncAdapter.ServerStatus int status = Utility.getServerStatus(preference.getContext()); 
     switch (status) { 
      case TimetableSyncAdapter.SERVER_STATUS_OK: 
       preference.setSummary(stringValue); 
       break; 
      case TimetableSyncAdapter.SERVER_STATUS_UNKNOWN: 
       preference.setSummary(preference.getContext().getString(R.string.pref_student_id_unknown_description, value.toString())); 
       break; 
      case TimetableSyncAdapter.SERVER_STATUS_ID_INVALID: 
       preference.setSummary(preference.getContext().getString(R.string.pref_student_id_invalid_id, value.toString())); 
       break; 
      default: 
       // Note --- if the server is down we still assume the value 
       // is valid 
       preference.setSummary(stringValue); 
     } 
    } else { 
     // For other preferences, set the summary to the value's simple string representation. 
     preference.setSummary(stringValue); 
    } 

} 

/** 
* Binds a preference's summary to its value. More specifically, when the 
* preference's value is changed, its summary (line of text below the 
* preference title) is updated to reflect the value. The summary is also 
* immediately updated upon calling this method. The exact display format is 
* dependent on the type of preference. 
* 
* @see #sBindPreferenceSummaryToValueListener 
*/ 
private static void bindPreferenceSummaryToValue(Preference preference) { 
    // Set the listener to watch for value changes. 
    preference.setOnPreferenceChangeListener(sBindPreferenceSummaryToValueListener); 

    // Trigger the listener immediately with the preference's 
    // current value. 
    sBindPreferenceSummaryToValueListener.onPreferenceChange(preference, 
      PreferenceManager 
        .getDefaultSharedPreferences(preference.getContext()) 
        .getString(preference.getKey(), "")); 
} 

/** 
* This method stops fragment injection in malicious applications. 
* Make sure to deny any unknown fragments here. 
*/ 
protected boolean isValidFragment(String fragmentName) { 
    return PreferenceFragment.class.getName().equals(fragmentName) 
      || GeneralPreferenceFragment.class.getName().equals(fragmentName) 
      || DataSyncPreferenceFragment.class.getName().equals(fragmentName) 
      || NotificationPreferenceFragment.class.getName().equals(fragmentName); 
} 

/** 
* This fragment shows general preferences only. It is used when the 
* activity is showing a two-pane settings UI. 
*/ 
@TargetApi(Build.VERSION_CODES.HONEYCOMB) 
public static class GeneralPreferenceFragment extends PreferenceFragment { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     addPreferencesFromResource(R.xml.pref_general); 
     setHasOptionsMenu(true); 



     // Bind the summaries of EditText/List/Dialog/Ringtone preferences 
     // to their values. When their values change, their summaries are 
     // updated to reflect the new value, per the Android Design 
     // guidelines. 

     bindPreferenceSummaryToValue(findPreference(getString(R.string.student_id_key))); 
     bindPreferenceSummaryToValue(findPreference(getString(R.string.pref_timetable_key))); 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     int id = item.getItemId(); 
     if (id == android.R.id.home) { 
      getActivity().finish(); 
      return true; 
     } 
     return super.onOptionsItemSelected(item); 
    } 

} 


/** 
* This fragment shows notification preferences only. It is used when the 
* activity is showing a two-pane settings UI. 
*/ 
@TargetApi(Build.VERSION_CODES.HONEYCOMB) 
public static class NotificationPreferenceFragment extends PreferenceFragment { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     addPreferencesFromResource(R.xml.pref_notification); 
     setHasOptionsMenu(true); 

     // Bind the summaries of EditText/List/Dialog/Ringtone preferences 
     // to their values. When their values change, their summaries are 
     // updated to reflect the new value, per the Android Design 
     // guidelines. 
     bindPreferenceSummaryToValue(findPreference("notifications_new_message_ringtone")); 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     int id = item.getItemId(); 
     if (id == android.R.id.home) { 
      getActivity().finish(); 
      return true; 
     } 
     return super.onOptionsItemSelected(item); 
    } 
} 

/** 
* This fragment shows data and sync preferences only. It is used when the 
* activity is showing a two-pane settings UI. 
*/ 
@TargetApi(Build.VERSION_CODES.HONEYCOMB) 
public static class DataSyncPreferenceFragment extends PreferenceFragment { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     addPreferencesFromResource(R.xml.pref_data_sync); 
     setHasOptionsMenu(true); 

     // Bind the summaries of EditText/List/Dialog/Ringtone preferences 
     // to their values. When their values change, their summaries are 
     // updated to reflect the new value, per the Android Design 
     // guidelines. 
     bindPreferenceSummaryToValue(findPreference("sync_frequency")); 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     int id = item.getItemId(); 
     if (id == android.R.id.home) { 
      getActivity().finish(); 
      return true; 
     } 
     return super.onOptionsItemSelected(item); 
    } 
} 

}

pref_general.xml,然后launche S上的意图

enter image description here

意图将启动以下画面:

enter image description here

,我要点击学号优先启动以下

enter image description here

我想跳过第二个图像中的步骤,并且编程y推出最后一个意向

回答

0
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    setupActionBar(); 
    addPreferencesFromResource(R.xml.pref_general); 

    bindPreferenceSummaryToValue(findPreference(getString(R.string.student_id_key))); 
bindPreferenceSummaryToValue(findPreference(getString(R.string.pref_timetable_key))); 

    if (<student ID is empty)) { 
    showNoStudentIdDialog(); 
    } 

} 

是的,我知道,但我真的很困惑你在问什么。如果你想显示对话框,只需调用方法,以显示它在任何你想要的任何条件下...

+0

我更新了我的问题,更多详细信息 –

+0

如果你想显示对话框,只需显示它。就像我在我的答案中加入了代码一样。我不明白什么阻止你这样做。 –

+0

这是在用户加载设置活动之前首次启动应用程序时所做的检查。我已经在我的问题中添加了另一个图像 –