- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我尝试使用 PreferenceFragment 从 Activity 调用它,当我从 ActionBar 单击一个图标时,我只是调用 FragmentPreferences whit Intent:
case R.id.settings:
Intent prefs = new Intent(this, LogicAnalizerPrefs.class);
startActivity(prefs);
break;
在这种情况下,当我单击我的图标时,应用程序简单卡住,我的意思是它不会崩溃,并且在 LogCat 简单卡住上没有什么奇怪的,如果我再次单击我会收到 ANR。如果我改用:
getFragmentManager().beginTransaction().replace(android.R.id.content, new LogicAnalizerPrefs()).commit();
我可以看到 fragment ,但背景是透明的,我看到一些用户问同样的问题,但答案是调用 Intent ,但我的应用程序卡住了。这是我的 fragment 代码:
public class LogicAnalizerPrefs extends PreferenceFragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.logicanalizerprefs);
}
}
还有我的 logicalizerprefs.xml:
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >
<EditTextPreference
android:defaultValue="128"
android:key="buffer1"
android:summary="Buffer canal 1"
android:title="Buffer" />
<EditTextPreference
android:defaultValue="128"
android:key="buffer2"
android:summary="Buffer canal 2"
android:title="Buffer" />
<EditTextPreference
android:defaultValue="128"
android:key="buffer3"
android:summary="Buffer canal 3"
android:title="Buffer" />
<EditTextPreference
android:defaultValue="128"
android:key="buffer4"
android:summary="Buffer canal 4"
android:title="Buffer" />
</PreferenceScreen>
希望你能帮助我,我不知道它会是什么:/
--编辑--这是我从中调用我的首选项 Activity/fragment 的 Activity ,它使用图表引擎并实现一个可运行线程来刷新处理程序上的图表。
public class LogicAnalizerView extends Activity implements Runnable{
/** Debugging */
private static final boolean DEBUG = false; String TAG;
/** Varios */
static ActionBar actionBar; // ActionBar
static Thread myThread = null; // Thread para el metodo run() de Runnable
static boolean Running; // Ejecuta o no el while dentro de run()
static Random crazy = new Random(); // Clase Random para generar numeros aleatorios
/** Tiempo en el eje X */
static float time = (float) 0.0; // Tiempo transcurrido (eje X del grafico)
static final float TimeIncrement = (float) 0.4; // Tiempo que transcurre por muestreo (duracion de un 1-0)
static final int XMax = 10; // Valor maximo de X inicial
static final int XMin = 0; // Valor minimo de X inicial
static int Ticks = 0; // Veces que el grafico se actualiza
static final int maxTicks = (int) (XMax/TimeIncrement); // Cantidad de '1' y '0' que entran en el intervalo [XMin,XMax]
/** Buffers */
static int BufferSize; // Tamaño del buffer de recepcion
static byte[] ReceptionBuffer; // Buffer de recepcion
static byte[] Channel1; // Buffers para cada canal
static byte[] Channel2;
static byte[] Channel3;
static byte[] Channel4;
//Lineas en el grafico
TimeSeries[] input = new TimeSeries[4]; // Cada TimeSeries representa una funcion en el grafico
XYMultipleSeriesDataset dataset; // Agrupa todas las TimeSeries en el grafico
//Renderers
XYSeriesRenderer renderer; // Opciones de renderizado para cada TimeSeries
XYSeriesRenderer renderer1;
XYSeriesRenderer renderer2;
XYSeriesRenderer renderer3;
XYMultipleSeriesRenderer mRenderer; // Agrupa todas las opciones de renderizado del grafico
//GraphicalView
GraphicalView mChartView; // View del grafico (el grafico en si)
/**
* Creacion de la Activity
*/
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
/**
* ActionBar
*/
actionBar = getActionBar(); // Obtengo el ActionBar
actionBar.setDisplayHomeAsUpEnabled(true); // El icono de la aplicacion funciona como boton HOME
/**
* Preferencias
*/
SharedPreferences getPrefs = PreferenceManager.getDefaultSharedPreferences(getBaseContext());
Channel1 = new byte[Integer.decode(getPrefs.getString("buffer1", "128")) + 1]; // Tamaño de los buffers de cada canal basado en
Channel2 = new byte[Integer.decode(getPrefs.getString("buffer2", "128")) + 1]; // la configuracion +1 porque en el buffer[0] se coloca
Channel3 = new byte[Integer.decode(getPrefs.getString("buffer3", "128")) + 1]; // el tipo de protocolo (I2C, SPI, UART, etc)
Channel4 = new byte[Integer.decode(getPrefs.getString("buffer4", "128")) + 1];
ReceptionBuffer = new byte[64]; // Buffer de recepcion general de 64 bytes
/**
* Configuro el grafico
*/
//Crea una "Serie" que es una linea en el grafico llamado "Linea1"
input[0] = new TimeSeries("Entrada 1");
input[1] = new TimeSeries("Entrada 2");
input[2] = new TimeSeries("Entrada 3");
input[3] = new TimeSeries("Entrada 4");
//XYMultipleSeriesDataset contiene todas las series, es decir todas las lineas del grafico en esta clase
dataset = new XYMultipleSeriesDataset();
dataset.addSeries(input[0]); // Agregamos la serie que creamos a XYMultipleSeriesDataset que contiene todas las series
dataset.addSeries(input[1]);
dataset.addSeries(input[2]);
dataset.addSeries(input[3]);
//XYMultipleSeriesRenderer contiene todos los renderer de las diferentes series
//XYSeriesRenderer le da las propiedades a las Series (lineas) como color y esas cosas
mRenderer = new XYMultipleSeriesRenderer();
renderer = new XYSeriesRenderer();
renderer1 = new XYSeriesRenderer();
renderer2 = new XYSeriesRenderer();
renderer3 = new XYSeriesRenderer();
//Renderers
mRenderer.addSeriesRenderer(renderer); // Agrego el XYSeriesRenderer al grupo XYMultipleSeriesRenderer
mRenderer.addSeriesRenderer(renderer1);
mRenderer.addSeriesRenderer(renderer2);
mRenderer.addSeriesRenderer(renderer3);
mRenderer.setShowGrid(true); // Muestra una grilla en X e Y en el grafico
mRenderer.setYTitle("Canales"); // Titulo del eje Y
mRenderer.setYLabelsAlign(Align.CENTER); // Alineacion del titulo
mRenderer.setXTitle("Tiempo x100nS"); // Titulos del eje X
mRenderer.setXLabelsAlign(Align.CENTER); // Alineacion del titulo
mRenderer.setZoomButtonsVisible(true); // Botones de Zoom visibles
mRenderer.setZoomEnabled(true, false); // Zoom sobre el eje X solamente
mRenderer.setAntialiasing(true); // Usa antialising para dibujar
mRenderer.setXAxisMin(XMin); // Valor minimo del eje X
mRenderer.setXAxisMax(XMax); // Valor maximo del eje X
//Colores de lineas
renderer.setColor(Color.WHITE);
renderer1.setColor(Color.RED);
renderer2.setColor(Color.GREEN);
renderer3.setColor(Color.YELLOW);
//Grosores de lineas
renderer.setLineWidth(2);
renderer1.setLineWidth(3);
renderer2.setLineWidth(4);
renderer3.setLineWidth(5);
mChartView = ChartFactory.getLineChartView(this, dataset, mRenderer);
setContentView(mChartView);
}
/**
* Crea el ActionBar
*/
@Override
public boolean onCreateOptionsMenu(Menu menu) {
if(DEBUG) Log.i(TAG, "onCreateOptionsMenu() -> LogicAnalizerView");
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.actionbarmain, menu);
return true;
}
/**
* Listener de los iconos en el ActionBar
*/
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if(DEBUG) Log.i(TAG, "onOptionsItemSelected() -> LogicAnalizerView - Item: " + item.getItemId());
switch(item.getItemId()){
case android.R.id.home:
Intent intent = new Intent(this, MainMenu.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); //si la aplicacion ya esta abierta ir a ella no abrir otra nueva
startActivity(intent);
case R.id.settings:
Intent a = new Intent(this, MainMenu.class);
a.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(a);
//Intent prefs = new Intent(getApplicationContext(), LogicAnalizerPrefs.class);
//startActivity(prefs);
break;
case R.id.save:
createDialog();
break;
}
return true;
}
/**
* Crea una ventana perguntando al usuario el nombre con el que desea guardar la imagen del grafico
*/
private void createDialog() {
Running = false; //Detengo el Thread run()
AlertDialog.Builder alert = new AlertDialog.Builder(this);
alert.setTitle("Guardar");
alert.setMessage("Nombre de archivo");
// Creamos un EditView para que el usuario escriba
final EditText input = new EditText(this);
alert.setView(input);
// Creamos el boton OK y su onClickListener
alert.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
Editable text = input.getText(); // Obtengo el texto que escribio el usuario
Bitmap bitmap = mChartView.toBitmap(); // Creo un nuevo BitMap
try { //Creo un nuevo archivo con el nombre del usuario y extension .jpeg
File image = new File(Environment.getExternalStorageDirectory(), "Multi\\" + text.toString() + ".jpeg");
if(image.exists()){
createDialogConfirm();
}
FileOutputStream output = new FileOutputStream(image);
bitmap.compress(CompressFormat.JPEG, 100, output);
} catch (FileNotFoundException e) { e.printStackTrace(); }
Running = true;
}
});
// Boton cancelar
alert.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
dialog.dismiss();
Running = true;
}
});
alert.show();
}
private boolean createDialogConfirm() {
AlertDialog.Builder confirm = new AlertDialog.Builder(this);
confirm.setTitle("Guardar");
confirm.setMessage("El archivo existe, sobreescribir ?");
// Boton cancelar
confirm.setPositiveButton("Si", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
}
});
// Boton cancelar
confirm.setNegativeButton("No", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
dialog.dismiss();
}
});
confirm.show();
return true;
}
/**
* Prueba de byte
* @param a: byte para testear
* @param bit: numero de bit a testear 0-7
*/
public boolean bitTest (byte a, int bit) {
return (a & (1 << bit)) != 0;
}
/**
* @author Andres
* Se llama al crear la Activity y al volver a ella si se ha salido, aqui creamos el Thread run() y lo iniciamos, a su vez seteamos
* el item del DropDown menu del ActionBar a la aplicacion actual.
* @see http://developer.android.com/reference/android/app/Activity.html
*/
@Override
protected void onResume() {
super.onResume();
//Creo el Thread y lo inicio
Running = true;
myThread = new Thread(this);
myThread.start();
}
/**
* @author Andres
* Cuando se pausa la Activity se elimina el Thread run() para liberar recursos ya que no sera usado y se lo iguala a null para
* no provocar un error si por accidente se intenta usarlo
*/
@Override
protected void onPause() {
super.onPause();
//destruyo el Thread
Running = false;
try {
myThread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
myThread = null; //pongo el Thread como null para no provocar errores
}
/**
* @author Andres
* Lee cada aproximadamente 500mS los datos que se tienen del analizador logico y los muestra en el grafico llamando a un Handler
* debido a que el grafico debe ser actualizado desde el Main Thread.
* @see "private Handler uiCallback = new Handler ()" debajo.
*/
@Override
public void run() {
while(true){
while(Running){
if(DEBUG) Log.i(TAG, "run() -> LogicAnalizerView");
uiCallback.sendEmptyMessage(0);
if(DEBUG) Log.i(TAG, "run() -> LogicAnalizerView - Thread.sleep()");
try { Thread.sleep(500); }
catch (InterruptedException e) { e.printStackTrace(); }
}
try { Thread.sleep(500); }
catch (InterruptedException e) { e.printStackTrace(); }
}
}
/**
* @author Andres
* Los Handlers ejecutan sus operaciones en el Thread de la UI haciendo posible la modificacion de la misma desde Threads no UI.
* @see http://developer.android.com/guide/topics/fundamentals/processes-and-threads.html
* @see http://developer.android.com/reference/android/os/Handler.html
*/
private Handler uiCallback = new Handler () {
public void handleMessage (Message msg) {
Running = false;
if(DEBUG) Log.i(TAG, "XAxisMax: " + mRenderer.getXAxisMax() + " Time: " + time + " Ticks: " + Ticks);
if(DEBUG) Log.i(TAG, "XAxisMin: " + mRenderer.getXAxisMin());
final int[] factor = {0, 2, 4, 6}; // Valores tomados como 0 logicos
// Si hay datos listos
if(USBMulti.isLogicAnalizerDataRdy()){
ReceptionBuffer = USBMulti.getLogicAnalizerData(); // Obtengo los datos desde el USB
}
// Si los bit son 1 le sumo 1 a los valores tomados como 0 logicos
for(int n=0; n < ReceptionBuffer.length; ++n){ // Voy a traves de los bytes recibidos
for(int bit=0; bit < 4; ++bit){ // Voy a traves de los 4 bits de cada byte
if(bitTest(ReceptionBuffer[n],bit)){
input[bit].add(time, factor[bit]+1);
}
else{
input[bit].add(time, factor[bit]);
}
}
time += TimeIncrement; // Incremento el tiempo
++Ticks; // Incremento ticks
//Si llego al maximo del cuadro (borde derecho) aumento el maximo y el minimo para dibujar un tiempo mas
//(desplazamiento del cuadro) de esta manera si deslizamos el cuadro horizontalmente tendremos los datos
if(Ticks >= maxTicks){
mRenderer.setXAxisMax(mRenderer.getXAxisMax()+TimeIncrement);
mRenderer.setXAxisMin(mRenderer.getXAxisMin()+TimeIncrement);
}
}
if(DEBUG) Log.i(TAG, "uiCallback -> LogicAnalizerView - mChartView.repaint()");
if(mChartView != null) mChartView.repaint(); // Redibujo el grafico
Running = true;
}
};
最佳答案
我使用的是一种相当简单的方法,所以这里基本上是我的一个项目的复制/粘贴 - 希望你能使用它。您显然需要用自己的东西替换某些部分,即首选项、字符串、 namespace 等 :-)
显示首选项屏幕:
startActivity(new Intent(getApplicationContext(), Preferences.class));
偏好类:
import java.util.List;
import android.os.Bundle;
import android.preference.PreferenceActivity;
public class Preferences extends PreferenceActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public void onBuildHeaders(List<Header> target) {
loadHeadersFromResource(R.xml.preference_headers, target);
}
}
偏好等级:
import android.os.Bundle;
import android.preference.PreferenceFragment;
public class Prefs extends PreferenceFragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
int res=getActivity().getResources().getIdentifier(getArguments().getString("resource"), "xml", getActivity().getPackageName());
addPreferencesFromResource(res);
}
}
preference_headers.xml(在 res/xml 中):
You'll need a header listing for each preference screen (fragment).
<preference-headers xmlns:android="http://schemas.android.com/apk/res/android" >
<header
android:fragment="com.miz.mizuu.Prefs"
android:icon="@drawable/search"
android:title="@string/prefsIdentificationAndSearch" >
<extra
android:name="resource"
android:value="preferences" />
</header>
<header
android:fragment="com.miz.mizuu.Prefs"
android:icon="@drawable/apptheme"
android:title="@string/prefsUI" >
<extra
android:name="resource"
android:value="preferences2" />
</header>
</preference-headers>
preferences.xml、preferences2.xml 等(在/res/xml 中):
You'll need separate preference xml files for each of the referenced "extras" in preference_headers.xml. This means that the code above relies on preferences.xml and preferences2.xml.
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >
<PreferenceCategory android:title="@string/prefsIdentification" >
<CheckBoxPreference
android:defaultValue="false"
android:icon="@drawable/localizedinfo"
android:key="prefsUseLocalData"
android:summary="@string/prefsUseLocalDataDescription"
android:title="@string/prefsUseLocalDataTitle" >
</CheckBoxPreference>
</PreferenceCategory>
</PreferenceScreen>
关于android - 如何使用 PreferenceFragment?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10405773/
我在网上搜索但没有找到任何合适的文章解释如何使用 javascript 使用 WCF 服务,尤其是 WebScriptEndpoint。 任何人都可以对此给出任何指导吗? 谢谢 最佳答案 这是一篇关于
我正在编写一个将运行 Linux 命令的 C 程序,例如: cat/etc/passwd | grep 列表 |剪切-c 1-5 我没有任何结果 *这里 parent 等待第一个 child (chi
所以我正在尝试处理文件上传,然后将该文件作为二进制文件存储到数据库中。在我存储它之后,我尝试在给定的 URL 上提供文件。我似乎找不到适合这里的方法。我需要使用数据库,因为我使用 Google 应用引
我正在尝试制作一个宏,将下面的公式添加到单元格中,然后将其拖到整个列中并在 H 列中复制相同的公式 我想在 F 和 H 列中输入公式的数据 Range("F1").formula = "=IF(ISE
问题类似于this one ,但我想使用 OperatorPrecedenceParser 解析带有函数应用程序的表达式在 FParsec . 这是我的 AST: type Expression =
我想通过使用 sequelize 和 node.js 将这个查询更改为代码取决于在哪里 select COUNT(gender) as genderCount from customers where
我正在使用GNU bash,版本5.0.3(1)-发行版(x86_64-pc-linux-gnu),我想知道为什么简单的赋值语句会出现语法错误: #/bin/bash var1=/tmp
这里,为什么我的代码在 IE 中不起作用。我的代码适用于所有浏览器。没有问题。但是当我在 IE 上运行我的项目时,它发现错误。 而且我的 jquery 类和 insertadjacentHTMl 也不
我正在尝试更改标签的innerHTML。我无权访问该表单,因此无法编辑 HTML。标签具有的唯一标识符是“for”属性。 这是输入和标签的结构:
我有一个页面,我可以在其中返回用户帖子,可以使用一些 jquery 代码对这些帖子进行即时评论,在发布新评论后,我在帖子下插入新评论以及删除 按钮。问题是 Delete 按钮在新插入的元素上不起作用,
我有一个大约有 20 列的“管道分隔”文件。我只想使用 sha1sum 散列第一列,它是一个数字,如帐号,并按原样返回其余列。 使用 awk 或 sed 执行此操作的最佳方法是什么? Accounti
我需要将以下内容插入到我的表中...我的用户表有五列 id、用户名、密码、名称、条目。 (我还没有提交任何东西到条目中,我稍后会使用 php 来做)但由于某种原因我不断收到这个错误:#1054 - U
所以我试图有一个输入字段,我可以在其中输入任何字符,但然后将输入的值小写,删除任何非字母数字字符,留下“。”而不是空格。 例如,如果我输入: 地球的 70% 是水,-!*#$^^ & 30% 土地 输
我正在尝试做一些我认为非常简单的事情,但出于某种原因我没有得到想要的结果?我是 javascript 的新手,但对 java 有经验,所以我相信我没有使用某种正确的规则。 这是一个获取输入值、检查选择
我想使用 angularjs 从 mysql 数据库加载数据。 这就是应用程序的工作原理;用户登录,他们的用户名存储在 cookie 中。该用户名显示在主页上 我想获取这个值并通过 angularjs
我正在使用 autoLayout,我想在 UITableViewCell 上放置一个 UIlabel,它应该始终位于单元格的右侧和右侧的中心。 这就是我想要实现的目标 所以在这里你可以看到我正在谈论的
我需要与 MySql 等效的 elasticsearch 查询。我的 sql 查询: SELECT DISTINCT t.product_id AS id FROM tbl_sup_price t
我正在实现代码以使用 JSON。 func setup() { if let flickrURL = NSURL(string: "https://api.flickr.com/
我尝试使用for循环声明变量,然后测试cols和rols是否相同。如果是,它将运行递归函数。但是,我在 javascript 中执行 do 时遇到问题。有人可以帮忙吗? 现在,在比较 col.1 和
我举了一个我正在处理的问题的简短示例。 HTML代码: 1 2 3 CSS 代码: .BB a:hover{ color: #000; } .BB > li:after {
我是一名优秀的程序员,十分优秀!