2017-08-18 2 views
1

J'ai hérité d'un projet Android Studio avec essentiellement aucune expérience avec la programmation Java. J'ai vécu et enseigné moi-même en utilisant des didacticiels en ligne gratuits et le guide du Big Nerd Ranch et je sais comment passer à différentes vues .xml en utilisant des classes .java associées, mais je veux ouvrir une nouvelle vue .xml associée à la même classe .java. Fondamentalement, je veux juste modifier l'application que j'ai qui lit des informations à partir d'un périphérique Bluetooth et affiche les mesures dans un TextView avec un affichage "Pass/Fail" pour avoir un affichage pass/fail et un bouton "View Log" Lorsque vous cliquez dessus, vous accédez à un nouveau fichier .xml contenant le TextView avec tous les résultats. J'essaie d'éviter d'utiliser une classe .java différente parce que je veux que tous les éléments aient les mêmes fonctions, juste sur des vues .xml différentes, et je suis inquiet de déplacer tout ce que j'ai déjà dans un nouveau La classe .java créera simplement plus de problèmes que j'en ai déjà.Comment puis-je basculer entre plusieurs vues en utilisant une seule classe java?

Je ne sais pas s'il est nécessaire, mais voici mon code: A partir de l'écran de mon départ

frament_bluetooth_scanner.xml: 
<LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content"> 

    <Button 
     android:id="@+id/go_to_log" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:padding="16dp" 
     android:text="@string/view_log" 
     android:textSize="20dp"/> 

    <View 
     android:id="@+id/view" 
     android:layout_width="fill_parent" 
     android:layout_height="2dp" 
     android:background="#ccc"/> 

</LinearLayout> 

<LinearLayout 
    android:orientation="horizontal" 
    android:paddingTop="@dimen/margin_small" 
    android:paddingLeft="4dp" 
    android:paddingRight="4dp" 
    android:paddingBottom="4dp" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_gravity="center_horizontal"> 


    <Button 
     android:id="@+id/button_present" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:background="#ffc4ab" 
     android:clickable="false" 
     android:padding="16dp" 
     android:text="NO TAGGANT DETECTED" 
     android:textSize="26dp" 
     /> 

</LinearLayout> 

button_present à la fois active le test Bluetooth et affiche le pass/fail résultats. Il existait et fonctionne comme prévu.

go_to_log est un bouton j'ajouté et je le veux cliquer pour me prendre à la vue suivante:

view_list.xml: 
<FrameLayout 
    android:orientation="horizontal" 
    android:paddingLeft="4dp" 
    android:paddingRight="4dp" 
    android:layout_width="match_parent" 
    android:layout_height="fill_parent" 
    android:visibility="visible" 
    android:layout_gravity="center_horizontal"> 

    <Button 
     android:layout_width="fill_parent" 
     android:layout_height="40dp" 
     android:text="@string/clear_log" 
     android:id="@+id/button_clear_log" /> 

    <TextView 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:paddingTop="40dp" 
     android:textAppearance="?android:attr/textAppearanceSmall" 
     android:id="@+id/scanLogView" 
     android:maxLines = "4096" 
     android:text="@string/app_name" 
     android:scrollbars = "vertical" 
     android:layout_gravity="center_horizontal"/> 

</FrameLayout> 

Tout ce code était à l'origine dans le fichier fragment_bluetooth_scanner.xml et tout a fonctionné comme prévu. Le seul problème est que le TextView était difficile à lire car il affichait des informations pour tous les tests jusqu'à ce qu'il soit effacé, et toutes les informations ne rentraient pas à l'écran même pour un seul test. Je veux le changer pour être plus convivial.

Le fichier .java principal est assez long, donc je vais poster les parties pertinentes de celui-ci. De ScannerFragment.java:

@Override 
    public void onViewCreated(View view, @Nullable Bundle 
savedInstanceState) { 
    SP = PreferenceManager.getDefaultSharedPreferences(getContext()); 

    mPowerOffButton = (Button) view.findViewById(R.id.button_poweroff); 
    mDisconnectButton = (Button) view.findViewById(R.id.button_disconnect); 
    mConnectButton = (Button) view.findViewById(R.id.button_connect); 
    mPresence = (Button) view.findViewById(R.id.button_present); 

    mBattery = (ProgressBar) view.findViewById(R.id.progressBar); 

    mBlinkConnect = (Button) view.findViewById(R.id.button_connectionblink); 
    mBlinkData = (Button) view.findViewById(R.id.button_communication); 
    mClearLog = (Button) view.findViewById(R.id.button_clear_log); 

    mDeviceName = (Button) view.findViewById(R.id.button_devicename); 
    mDeviceSN = (Button) view.findViewById(R.id.button_devicesn); 
    mBatteryPerc = (TextView) view.findViewById(R.id.label_batterypct); 

    mReadingLog = (TextView) view.findViewById(R.id.scanLogView); 
    mReadingLog.setMovementMethod(new ScrollingMovementMethod()); 
    mReadingLog.setText(readFromFile()); 

    mViewLog = (Button)view.findViewById(R.id.go_to_log); 


    telephonyManager = (TelephonyManager)getContext().getSystemService(Context.TELEPHONY_SERVICE); 

    initLocationService(this.getContext()); 

    final ActionBar actionBar = getActivity().getActionBar(); 
    if (null == actionBar) { 
     return; 
    } 
    final Drawable D = getResources().getDrawable(R.drawable.stardust2); 
    actionBar.setBackgroundDrawable(D); 
    actionBar.setTitle(""); 



} 

private void setupScanner() { 
    Log.d(TAG, "setupScanner()"); 

    // Initialize the send button with a listener that for click events 
    mPowerOffButton.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 
      if(isIris) { 
       publishMessage(Constants.COMMAND_POWEROFF_IRIS); 
      } else { 
       publishMessage(Constants.COMMAND_POWEROFF); 
      } 
      mScannerService.stop(); 
     } 
    }); 

    // Initialize the send button with a listener that for click events 
    mDisconnectButton.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 
      // Send a message using content of the edit text widget 
      publishMessage(Constants.COMMAND_DISCONNECT); 
      mScannerService.stop(); 
     } 
    }); 

    // Initialize the send button with a listener that for click events 
    mConnectButton.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 
      // Send a message using content of the edit text widget 
      publishMessage(Constants.COMMAND_ON_CONNECT); 
     } 
    }); 

    mClearLog.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 
      // Send a message using content of the edit text widget 
      mReadingLog.setText(""); 
      if(SP.getBoolean("writeToFile", true)) { 
       writeToFile("", "", false); 
      } 
     } 
    }); 

C'est là toutes les actions existantes ont lieu. La principale chose qui me décourage de créer une nouvelle classe .java est que mReadingLog est utilisé tout au long de cette classe, et je ne comprends pas très bien lire/écrire des fichiers texte à ce stade, donc je veux éviter de modifier tout ce qui doit faire avec ce processus.

Je suis passé par des tutoriels dans le passé comme this one, mais je ne trouve rien sur la façon d'ouvrir un nouveau fichier xml tout en associant avec la même classe .java. Est-ce possible?

Répondre

1

Je ne suis pas sûr d'avoir compris. Mais si vous voulez basculer entre différentes vues en appuyant sur un bouton ou ... vous pouvez utiliser ViewFilpper.
Ajoutez-le en tant que vue dans votre présentation d'activité.

<ViewFlipper 
    android:id="@+id/simpleViewFlipper" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content"> 

    <!-- Add View’s Here Which You Want to Flip -- > 
    <include layout="First"/> 
    <include layout="Second"/> 
    <include layout="third"/> 
    <!-- ... --> 

</ ViewFlipper > 
+0

Merci pour la réponse! Cela fonctionne extrêmement bien et m'a sauvé tellement de temps et de maux de tête. Merci! –

1

... OK, donc je l'ai lu cette fois-ci ... lol ... vous pouvez créer une fonction dans une seule classe. Faites cela statique et vous pouvez appeler ces fonctions n'importe où.

C'est ce que je fais

public class MethodContants { 

    public static void showLog(String tag, String logMessage, boolean error) { 
     if (error) { 
      Log.e(tag, logMessage); 
     } else { 
      Log.i(tag, logMessage); 
     } 
    } 

    public static String showStringResource(int resource) { 
     return getApplicationContext().getResources().getString(resource); 
    } 


} 

Ainsi, dans une de mes classes, je peux appeler comme ceci:

MethodConstants.showLog(TAG, "message", true); 
+0

merci pour la réponse! Pour m'assurer que je comprends bien, 'MethodContacts' est votre classe java principale, donc pour moi je devrais faire ma fonction dans' public class ScannerFragment ... 'et la fonction que vous avez posté est juste un exemple d'une fonction statique qui peut être appelé de n'importe où dans n'importe quelle classe? Dois-je créer une classe distincte qui se rapporte à mon nouveau fichier XML et ensuite faire la fonction que ma nouvelle classe se réfère à statique dans le fichier java d'origine, puis appeler ces fonctions comme décrit à la fin de votre solution? –

+0

Lorsqu'une méthode est statique, vous pouvez l'appeler n'importe où dans vos classes. Mais vous devez vraiment faire attention à vous assurer de rendre les choses privées qui devraient l'être. Je mets toutes mes fonctions dans une classe et les rends statiques. Ces deux sont des exemples parfaits parce que l'un est un journal et l'autre est le R.string. Ressource. Mais, si vous changez de couleur, par exemple, créez une fonction statique et appelez-la où que ce soit. J'espère que cela a du sens. – DroiDev

+0

Je pense que c'est la meilleure façon d'aborder mon problème mais je n'ai pas les connaissances pour passer par un si gros projet et déclarer tout correctement. J'ai fini par utiliser viewFlipper, ce qui résout mon problème mais ne semble pas être aussi lisse que je le voudrais –