2013-11-11 7 views
1

У меня есть PreferenceActivity, в котором есть предпочтение. Я бы хотел, чтобы щелчок на этом Preference открыл диалоговое окно, представленное в другом классе. Класс Яркость содержит диалоговое окно для рендеринга. Это код.ShowDialog onClick Preference

// This is the PreferenceActivity Class (Settings) 
Preference bright; 
bright = (Preference) this.findPreference("bri"); 
bright.setOnPreferenceClickListener(new OnPreferenceClickListener() { 
      public boolean onPreferenceClick(Preference preference) { 

       Brightness brightness = new Brightness(); 
       brightness.ShowDialog(); 

       return true; 

      } 
      }); 

Brighness класс

public class Brightness extends Activity{ 

    private SeekBar brightbar; 
    private int brightness; 
    @SuppressWarnings("unused") 
    private ContentResolver cResolver; 
    private Window window; 
    TextView txtPerc; 

    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     ShowDialog(); 

    } 


    public void ShowDialog() { 
    final AlertDialog.Builder popDialog = new AlertDialog.Builder(getApplicationContext()); 
    final LayoutInflater inflater = (LayoutInflater) this.getSystemService(LAYOUT_INFLATER_SERVICE); 
    final View Viewlayout = inflater.inflate(R.layout.dialog_brightness, (ViewGroup) findViewById(R.id.layout_dialog)); 

     popDialog.setTitle("Set Brightness"); 
     popDialog.setView(Viewlayout); 

    brightbar = (SeekBar) findViewById(R.id.brightbar); 
    txtPerc = (TextView) findViewById(R.id.txtPercentage); 
    cResolver = getContentResolver(); 
    window = getWindow(); 
    brightbar.setMax(255); 
    brightbar.setKeyProgressIncrement(1); 

    brightbar = (SeekBar) findViewById(R.id.brightbar); 
    txtPerc = (TextView) findViewById(R.id.txtPercentage); 
    cResolver = getContentResolver(); 
    window = getWindow(); 
    brightbar.setMax(255); 
    brightbar.setKeyProgressIncrement(1); 

    try 
    { 
     brightness = Settings.System.getInt(getContentResolver(), Settings.System.SCREEN_BRIGHTNESS); 
     float perc = (brightness /(float)255)*100; 
     txtPerc.setText((int)perc +" %"); 
    } 
    catch (SettingNotFoundException e) 
    { 
     Log.e("Error", "Cannot access system brightness"); 
     e.printStackTrace(); 
    } 

    brightbar.setProgress(brightness); 
    brightbar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() 
    { 
     public void onStopTrackingTouch(SeekBar seekBar) 
     { 
      Settings.System.putInt(getContentResolver(), Settings.System.SCREEN_BRIGHTNESS, brightness); 
      LayoutParams layoutpars = window.getAttributes(); 
      layoutpars.screenBrightness = brightness/(float)255; 
      window.setAttributes(layoutpars); 
     } 

     public void onStartTrackingTouch(SeekBar seekBar) 
     { 

     } 

     public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) 
     { 


       brightness = progress; 

       float perc = (brightness /(float)255)*100; 
       txtPerc.setText((int)perc +" %"); 
     } 
    });  

    popDialog.setNeutralButton("Close", 
      new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int which) { 
        dialog.dismiss(); 
       } 

      }); 

    popDialog.create(); 
    popDialog.show(); 

} 
} 

Проблема заключается в том, что, когда я нажимаю на этом предпочтении краш-приложение! Это LogCat

11-11 18: 03: 57,788: Е/AndroidRuntime (18672): неустранимый: Основной 11-11 18: 03: 57,788: Е/AndroidRuntime (18672): Java. lang.NullPointerException 11-11 18: 03: 57.788: E/AndroidRuntime (18672): at android.content.ContextWrapper.getApplicationContext (ContextWrapper.java:109) 11-11 18: 03: 57.788: E/AndroidRuntime (18672): at com.packagename.Brightness.ShowDialog (Brightness.java:39) 11-11 18: 03: 57.788: E/AndroidRuntime (18672): at com.packagename.Settings $ 1.onPreferenceClick (Settings.java : 48) 11-11 18: 03: 57.788: E/Androi dRuntime (18672): at android.preference.Preference.performClick (Preference.java:952) 11-11 18: 03: 57.788: E/AndroidRuntime (18672): at android.preference.PreferenceScreen.onItemClick (PreferenceScreen. java: 215) 11-11 18: 03: 57.788: E/AndroidRuntime (18672): at android.widget.AdapterView.performItemClick (AdapterView.java:297) 11-11 18: 03: 57.788: E/AndroidRuntime (18672): at android.widget.AbsListView.performItemClick (AbsListView.java:1100) 11-11 18: 03: 57.788: E/AndroidRuntime (18672): at android.widget.AbsListView $ PerformClick.run (AbsListView .java: 2788) 11-11 18: 03: 57.788: E/AndroidRuntime (18672): at android.widget.AbsListView $ 1.run (AbsListView.java : 3463) 11-11 18: 03: 57.788: E/AndroidRuntime (18672): at android.os.Handler.handleCallback (Handler.java:730) 11-11 18: 03: 57.788: E/AndroidRuntime (18672): at android.os.Handler.dispatchMessage (Handler.java:92) 11-11 18: 03: 57.788: E/AndroidRuntime (18672): at android.os.Looper.loop (Looper.java: 137) 11-11 18: 03: 57.788: E/AndroidRuntime (18672): at android.app.ActivityThread.main (ActivityThread.java:5289) 11-11 18: 03: 57.788: E/AndroidRuntime (18672)): at java.lang.reflect.Method.invokeNative (родной метод) 11-11 18: 03: 57.788: E/AndroidRuntime (18672): at java.lang.reflect.Method.invoke (Method.java: 525) 11-11 18: 03: 57,78 8: E/AndroidRuntime (18672): at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:739) 11-11 18: 03: 57.788: E/AndroidRuntime (18672): at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:555) 11-11 18: 03: 57.788: E/AndroidRuntime (18672): at dalvik.system.NativeStart.main (родной метод)

+0

Если вы хотите начать работу, вы должны использовать startActivity (новый Intent (это, Brightness.class)), а не показывать диалог. – Aleksandr

+0

передать текущий контекст активности в 'AlertDialog.Builder (Brightness.this);' вместо приложения –

+0

проверить эту страницу http://developer.android.com/guide/topics/ui/settings.html – Aleksandr

ответ

0

Чтобы отобразить диалоговое окно, вы должны расширить яркость из диалога или фрагмента вместо действия.

+0

Если я это сделаю, это даст ошибку getContentResolver, getWindows и findViewById. Как я могу исправить? – user2976665

+0

Вы должны очистить свою цель. Если вам нужно начать новую деятельность - давайте начнем действовать правильно, если вам нужно показать диалог диалога - показать. Не смешивайте диалог и активность. – Aleksandr

+0

Я хочу показать диалог, но если я расширяю диалог или фрагмент вместо Activity, я получаю много ошибок (getContentResolver, getWindows ecc.) – user2976665

0

Вот код вида деятельности:

public class MainActivity extends FragmentActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     MyDialog dialog = new MyDialog(); 
     Bundle arguments = new Bundle(); 
     arguments.putString(MyDialog.ARGS, "Message"); 
     dialog.setArguments(arguments); 
     FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
     ft.add(dialog, dialog.getTag()); 
     ft.commitAllowingStateLoss();      
    } 
} 

и диалог:

public class MyDialog extends DialogFragment { 
    public static final String ARGS = "ARGS"; 

    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 
     AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 
     Bundle args = getArguments(); 
     String message; 
     if (args.containsKey(ARGS)) message = args.getString(ARGS); else message = "Sorry"; 
      builder.setTitle("Title") 
      .setMessage(message) 
      .setNeutralButton("OK", null); 
      return builder.create(); 
    } 
} 

Как использовать его с PrefernceActivity вам следует немного подумать.