2016-11-23 3 views
0

공식적인 SettingsActivity를 액티비티의 templete로 사용하고 내 preferenceactivity에는 두 개의 정적 클래스 "preferencefragment1"과 "preferencefragment2"가 있습니다.finish() 메서드를 호출하여 전체를 종료하는 방법

App이 기본 설정의 헤더를 클릭하는 동안 지정된 preferencefragment로 전환됩니다. 그런 다음 KEYCODE_BACK 이벤트로 onkeydown() 메소드의 finished() 메소드를 호출합니다. 헤더보기로 돌아갑니다. 그러나 내가 원하는 것은 preferencefragment 뷰에서 mainactivity로 돌아가서 전체 PreferenceActivity를 단지 preferencefragment1 뷰 대신 완료되도록 만드는 것입니다.

나는 preferenceActivity를 사용하여 블루투스 통신 장치의 매개 변수를 설정하고 매개 변수 설정이 완료된 후 즉시 매개 변수를 onActivityResult() 메서드에서 보낼 수 있습니다. 하지만 이제는 주 동작으로 돌아 가기 위해 BACK (뒤로) 버튼을 두 번 클릭해야합니다. 헤더보기를 건너 뛰고 preferencefragment보기로 바로 이동할 수 있습니까? program flow

import android.annotation.TargetApi; 
import android.app.AlertDialog; 
import android.content.Context; 
import android.content.DialogInterface; 
import android.content.Intent; 
import android.content.res.Configuration; 
import android.os.Build; 
import android.os.Bundle; 
import android.preference.EditTextPreference; 
import android.preference.ListPreference; 
import android.preference.Preference; 
import android.preference.PreferenceActivity; 
import android.app.ActionBar; 
import android.preference.PreferenceFragment; 
import android.preference.PreferenceManager; 
import android.preference.SwitchPreference; 
import android.util.Log; 
import android.view.KeyEvent; 
import android.view.MenuItem; 
import java.util.List; 
public class SettingsActivity extends PreferenceActivity { 
    private static List<Header> headers; 
    private static Preference.OnPreferenceChangeListener sBindPreferenceSummaryToValueListener = new Preference.OnPreferenceChangeListener() { 
     @Override 
     public boolean onPreferenceChange(Preference preference, Object value) { 
      String stringValue = value.toString(); 
      if (preference instanceof ListPreference) { 
       ListPreference listPreference = (ListPreference) preference; 
       int index = listPreference.findIndexOfValue(stringValue); 
       preference.setSummary(
         index >= 0 
           ? listPreference.getEntries()[index] 
           : null); 
      } 
      if (preference instanceof EditTextPreference) { 
       EditTextPreference editTextPreference = (EditTextPreference) preference; 
       editTextPreference.setSummary(stringValue); 
      } 
      if (preference instanceof SwitchPreference) { 
       SwitchPreference switchPreference = (SwitchPreference) preference; 
       switchPreference.setSummary(stringValue); 
      } 
      return true; 
     } 
    }; 

    private static boolean isXLargeTablet(Context context) { 
     return (context.getResources().getConfiguration().screenLayout 
       & Configuration.SCREENLAYOUT_SIZE_MASK) >= Configuration.SCREENLAYOUT_SIZE_XLARGE; 
    } 
    public boolean onKeyDown(int keyCode, KeyEvent event) { 
     if (keyCode == KeyEvent.KEYCODE_BACK) { 
      AlertDialog.Builder builder = new AlertDialog.Builder(this); 
      builder.setTitle("Confirm to update system paras?"); 
      builder.setPositiveButton("YES", new DialogInterface.OnClickListener() { 
       @Override 
       public void onClick(DialogInterface dialog, int which) { 
        setResult(RESULT_OK); 
        finish(); 

       } 
      }); 
      builder.setNegativeButton("CANCELED", new DialogInterface.OnClickListener() { 
       @Override 
       public void onClick(DialogInterface dialog, int which) { 
        finish(); 
       } 
      }); 
      builder.show(); 
     } 
     return super.onKeyDown(keyCode, event); 
    } 
    @Override 
    protected void onActivityResult (int requestCode, int resultCode, Intent data) 
    { 
     System.out.print(resultCode); 
    } 

    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(), "")); 
    } 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     // addPreferencesFromResource(R.xml.pref_system); 
     setupActionBar(); 
    } 

    private void setupActionBar() { 
     ActionBar actionBar = getActionBar(); 
     if (actionBar != null) { 
      // Show the Up button in the action bar. 
      // actionBar.setDisplayHomeAsUpEnabled(true); 
     } 
    } 

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

    /** 
    * {@inheritDoc} 
    */ 
    @Override 
    @TargetApi(Build.VERSION_CODES.HONEYCOMB) 
    public void onBuildHeaders(List<Header> target) { 
     loadHeadersFromResource(R.xml.pref_headers, target); 
     headers=target; 
    } 

    /** 
    * 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) 
       || SystemPreferenceFragment.class.getName().equals(fragmentName); 

    } 

    /** 
    * This fragment shows general preferences only. It is used when the 
    * activity is showing a two-pane settings UI. 
    */ 
    public static class SystemPreferenceFragment extends PreferenceFragment { 
     @Override 
     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      addPreferencesFromResource(R.xml.pref_system); 
      setHasOptionsMenu(true); 
      bindPreferenceSummaryToValue(findPreference("pref_key_ip")); 
      bindPreferenceSummaryToValue(findPreference("pref_key_port")); 
      bindPreferenceSummaryToValue(findPreference("pref_key_output1_level")); 
      bindPreferenceSummaryToValue(findPreference("pref_key_output2_level")); 
      bindPreferenceSummaryToValue(findPreference("pref_key_output3_level")); 
      bindPreferenceSummaryToValue(findPreference("pref_key_noportrait")); 
      bindPreferenceSummaryToValue(findPreference("pref_key_closeeye")); 
      bindPreferenceSummaryToValue(findPreference("pref_key_yawn")); 
      bindPreferenceSummaryToValue(findPreference("pref_key_distract")); 
     } 

     @Override 
     public boolean onOptionsItemSelected(MenuItem item) { 
      int id = item.getItemId(); 
      if (id == android.R.id.home) { 
       startActivity(new Intent(getActivity(), SettingsActivity.class)); 
       return true; 
      } 
      return super.onOptionsItemSelected(item); 
     } 
    } 

     /* 
     @Override 
     public void onStop() 
     { 
      super.onStop(); 
      AlertDialog.Builder builder = new AlertDialog.Builder(this.getActivity()); 
      builder.setTitle("Confirm to update system paras?"); 
      builder.setPositiveButton("YES", new DialogInterface.OnClickListener() { 
       @Override 
       public void onClick(DialogInterface dialog, int which) { 
        SystemPreferenceFragment.this.getActivity().setResult(RESULT_OK); 
       } 
      }); 
      builder.setNegativeButton("CANCELED", new DialogInterface.OnClickListener() { 
       @Override 
       public void onClick(DialogInterface dialog, int which) { 
        SystemPreferenceFragment.this.getActivity().setResult(RESULT_CANCELED); 
       } 
      }); 
      builder.show(); 
      this.getActivity().finish(); 
     }*/ 

    @TargetApi(Build.VERSION_CODES.HONEYCOMB) 
    public static class RealtimePreferenceFragment extends PreferenceFragment { 
     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      addPreferencesFromResource(R.xml.pref_realtime); 
      setHasOptionsMenu(true); 
     } 

     @Override 
     public boolean onOptionsItemSelected(MenuItem item) { 
      int id = item.getItemId(); 
      if (id == android.R.id.home) { 
       startActivity(new Intent(getActivity(), SettingsActivity.class)); 
       return true; 
      } 
      return super.onOptionsItemSelected(item); 
     } 
    } 
} 

답변

0

사용 getActivity().finish();

+0

나는 두 가지 활동, 즉 쇼 헤더에 대한 PreferenceActivity A와 설정 페이지 표시에 대한 PreferenceActivity B가 있다고 생각합니다. 시작 B, preferenceActivity가 아닙니다. preferenceFragment B로 전환합니다. – SNOWA

+0

흐름을 이해할 수 있습니까? – SaravInfern

+0

활동의 흐름도를 제공 할 수 있습니까? 오른쪽에 흐름 그림 https://i.stack.imgur.com/ZnHe3이 추가되었습니다. .png – SNOWA

0

문제가 해결 가압되고 다시 알릴 활동 단편에서 인터페이스를 사용하는 방법을 노출 활성을

또는

완료하기!

1 단계 : MainActivity에서 "FLAG_ACTIVITY_NO_HISTORY"플래그를 인 텐트에 추가 한 다음 SettingsActivity를 시작하십시오.

2 단계 : SettingsActivity (PreferenceActivity)의 onBuildStartFragmentIntent() 메소드를 재정 의하여 FLAG_ACTIVITY_FORWARD_RESULT 플래그를 추가하여 activityresult가 MainActivity로 돌아갈 수 있도록합니다.

Like below: @Override 

public Intent onBuildStartFragmentIntent (String fragmentName, 
             Bundle args, 
             int titleRes, 
             int shortTitleRes) 
    { 
     Intent intent = new Intent(Intent.ACTION_MAIN); 
     intent.setClass(this, getClass()); 
     intent.putExtra(EXTRA_SHOW_FRAGMENT, fragmentName); 
     intent.putExtra(EXTRA_SHOW_FRAGMENT_ARGUMENTS, args); 
     intent.putExtra(EXTRA_SHOW_FRAGMENT_TITLE, titleRes); 
     intent.putExtra(EXTRA_SHOW_FRAGMENT_SHORT_TITLE, shortTitleRes); 
     intent.putExtra(EXTRA_NO_HEADERS, true); 
     intent.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);//the new statement 
     return intent; 
    } 
관련 문제