Autore Topic: Applicazione Android con utilizzo fragment  (Letto 1777 volte)

Offline cri90

  • Nuovo arrivato
  • *
  • Post: 14
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Corby GT-I5500
  • Sistema operativo:
    Ubuntu 12.10, Windows 7
Applicazione Android con utilizzo fragment
« il: 17 Marzo 2013, 11:39:41 CET »
0
Buongiorno a tutti, sono alle prime armi con android, e sto facendo un lavoro di tesi su una applicazione che gestisce l'affidabilità degli url dopo la lettura di un QR Code. La mia applicazione funzionava bene però mi sono accorto che la grafica non si adattava a tutti i  tipi di dispositivi, tipo i tablet o smartphone con schermo più grande.. quindi leggendo delle guide ho capito che devo fare uso dei fragment e quindi modificare la mia applicazione. Ho provato a modificare l'applicazione ma non riesco a farla funzionare in questo modo. Se qualcuno mi desse una mano gliene sarei grato. Nell'applicazione ho 2 schermate in ognuna delle quali ho un solo fragment.
Questa è la prima e anche la principale:
activity_main.xml

Codice (Java): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="horizontal" >
   
   <fragment
       class="com.example.qrcodesecurity.FragmentMain"
       android:id="@+id/menuFragment"
       android:layout_width="fill_parent"
       android:layout_height="fill_parent" >

   </fragment>
   
</RelativeLayout>
e il suo fragment è così descritto:
fragment_main.xml
Codice (Java): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="@drawable/celes" >
   
        <WebView
        android:id="@+id/webview"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true" />


    <ImageButton
        android:id="@+id/buttonPrag"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"
        android:layout_marginRight="14dp"
        android:src="@drawable/prag" />

    <ImageButton
        android:id="@+id/buttonUnica"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_marginRight="17dp"
        android:src="@drawable/unicar" />

    <ImageButton
        android:id="@+id/buttonDiee"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:src="@drawable/diee" />

    <ImageButton
        android:id="@+id/buttonScan"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/webview"
        android:layout_marginTop="32dp"
        android:layout_toLeftOf="@+id/buttonPrag"
        android:includeFontPadding="false"
        android:src="@drawable/scan" />

    <TextView
        android:id="@+id/scanResult"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_below="@+id/buttonScan"
        android:layout_marginTop="20dp"
        android:textColor="#000000"
        android:textColorHint="#000000"
        android:textColorLink="#000000"
        android:textSize="24sp"
        android:textStyle="bold|italic"
        android:typeface="sans" />

    <Button
        android:id="@+id/exit"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:text="X" />

</RelativeLayout>
e questa è la seconda schermata anche essa con un solo fragment:
activity_error.xml
Codice (Java): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
   
       <fragment
       class="com.example.qrcodesecurity.FragmentError"
       android:id="@+id/submenu"
       android:layout_width="fill_parent"
       android:layout_height="fill_parent" >

   </fragment>
   
</RelativeLayout>

fragment: fragment_error.xml
Codice (Java): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="@drawable/warning" >

        <WebView
        android:id="@+id/webview"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true" />

    <Button
        android:id="@+id/buttonNew"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:layout_marginBottom="22dp"
        android:layout_marginLeft="10dp"
        android:layout_marginRight="10dp"
        android:onClick="Intent.ACTION_VIEW"
        android:text="NEW SCAN" />

    <Button
        android:id="@+id/buttonConnection"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_above="@+id/buttonNew"
        android:layout_alignParentLeft="true"
        android:layout_marginBottom="16dp"
        android:layout_marginLeft="10dp"
        android:layout_marginRight="10dp"
        android:onClick="Intent.ACTION_VIEW"
        android:text="OPEN URL ANYWAY" />

    <TextView
        android:id="@+id/scanResult"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_below="@+id/exit"
        android:freezesText="false"
        android:includeFontPadding="false"
        android:selectAllOnFocus="false"
        android:textColor="#000000"
        android:textColorHint="#000000"
        android:textColorLink="#000000"
        android:textSize="24sp"
        android:textStyle="bold|italic"
        android:typeface="sans" />

        <Button
        android:id="@+id/exit"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:onClick="onExit"
        android:text="X" />
   
</RelativeLayout>

Dopo di che da diverse guide ho capito che occore una classe per gestire ogni fragment e una classe per ogni layout. Quindi mi occorrevano 4 classi. Posto anche queste:

FragmentMain.java che si riferisce a fragment_main
Codice (Java): [Seleziona]
package com.example.qrcodesecurity;

import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.webkit.WebView;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.TextView;

public class FragmentMain extends Fragment {
       
        private static final Intent SCAN_INTENT = new Intent("com.google.zxing.client.android.SCAN");

        WebView mWebView;
        ImageButton buttonPrag,buttonUnica,buttonDiee,buttonScan;
        Button exit;
        TextView scanResult;

       
           // activity listener
           private OnMenufragListener menufragListener;

           // interface for communication with activity
           public interface OnMenufragListener {
              public void onMenufrag();
           }
           
           // onAttach
           @Override
           public void onAttach(Activity activity) {
              super.onAttach(activity);
              try {
                 menufragListener = (OnMenufragListener) activity;
              } catch (ClassCastException e) {
                 throw new ClassCastException(activity.toString()+" must implement OnMenufragListener");
              }
           }
           
           // onCreate
           @Override
           public void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
           }

           // onActivityCreated
           @Override
           public void onActivityCreated(Bundle savedInstanceState) {
              super.onActivityCreated(savedInstanceState);
           }
           
           // onCreateView
           @Override
           public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState) {
              View view = inflater.inflate(R.layout.fragment_main,container,false);
              buttonScan = (ImageButton)view.findViewById(R.id.buttonScan);
              buttonScan.setOnClickListener(new View.OnClickListener() {
                  @Override
                  public void onClick(View v) {
                          startActivityForResult(SCAN_INTENT, 0);
                  }
               });
             
              buttonPrag = (ImageButton)view.findViewById(R.id.buttonPrag);
              buttonPrag.setOnClickListener(new View.OnClickListener() {
                  @Override
                  public void onClick(View v) {
                        Uri uri = Uri.parse("[url=http://prag.diee.unica.it/pra/"]Pattern Recognition and Applications Group | Pattern Recognition and Applications Group[/url]);
                        Intent intent = new Intent(Intent.ACTION_VIEW,uri);
                        intent.setClassName("com.android.browser","com.android.browser.BrowserActivity");
                        startActivity(intent);
 
                  }
               });
             
              buttonUnica = (ImageButton)view.findViewById(R.id.buttonUnica);
              buttonUnica.setOnClickListener(new View.OnClickListener() {
                  @Override
                  public void onClick(View v) {
                        Uri uri = Uri.parse("www.unica.it");
                        Intent intent = new Intent(Intent.ACTION_VIEW,uri);
                        intent.setClassName("com.android.browser","com.android.browser.BrowserActivity");
                        startActivity(intent);
 
                  }
               });
             
              buttonDiee = (ImageButton)view.findViewById(R.id.buttonDiee);
              buttonDiee.setOnClickListener(new View.OnClickListener() {
                  @Override
                  public void onClick(View v) {
                        Uri uri = Uri.parse("http://www.diee.unica.it/");
                        Intent intent = new Intent(Intent.ACTION_VIEW,uri);
                        intent.setClassName("com.android.browser","com.android.browser.BrowserActivity");
                        startActivity(intent);
                  }
               });
             
              exit = (Button)view.findViewById(R.id.exit);
              exit.setOnClickListener(new View.OnClickListener() {
                  @Override
                  public void onClick(View v) {
                          onStop();
                  }
               });
             
              scanResult = (TextView) getView().findViewById(R.id.scanResult);
             
             
              return view;
           }

                public void onScan(View view) {
                        startActivityForResult(SCAN_INTENT, 0);    
                        }
}

FragmentError.java che si riferisce a fragment_error.xml
Codice (Java): [Seleziona]
package com.example.qrcodesecurity;

import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.webkit.WebView;
import android.widget.Button;
import android.widget.TextView;

public class FragmentError extends Fragment {
       
        private static final Intent SCAN_INTENT = new Intent("com.google.zxing.client.android.SCAN");
       
        Button buttonNew, buttonConnection, exit;
        TextView scanResult;
        WebView mWebView;
       

       
        // onCreate
           @Override
           public void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
           }

           // onActivityCreated
           @Override
           public void onActivityCreated(Bundle savedInstanceState) {
              super.onActivityCreated(savedInstanceState);
           }
           
           // onCreateView
           @Override
           public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState) {
              View view = inflater.inflate(R.layout.fragment_error,container,false);
              buttonNew = (Button)view.findViewById(R.id.buttonNew);
              // button listener
              buttonNew.setOnClickListener(new View.OnClickListener() {
                 @Override
                 public void onClick(View v) {
                          startActivityForResult(SCAN_INTENT, 0);
                 }
              });
             
              buttonConnection = (Button)view.findViewById(R.id.buttonConnection);
              // button listener
              buttonConnection.setOnClickListener(new View.OnClickListener() {
                 @Override
                 public void onClick(View v) {
                         Intent i = new Intent(Intent.ACTION_VIEW);
                                 i.setData(Uri.parse(SCAN_INTENT.getStringExtra("SCAN_RESULT")));
                                        startActivity(i);
                 }
              });
             
              exit = (Button)view.findViewById(R.id.exit);
              exit.setOnClickListener(new View.OnClickListener() {
                  @Override
                  public void onClick(View v) {
                          onStop();
                  }
               });
             
              scanResult = (TextView) getView().findViewById(R.id.scanResult);
             
              return view;
           }

}

 e le 2 classi per i 2 layout:
ActivityMain.java che si riferisce a activity_main.xml
Codice (Java): [Seleziona]
package com.example.qrcodesecurity;

import android.app.Activity;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.webkit.WebView;
import android.widget.Button;
import android.widget.TextView;

public class ActivityMain extends FragmentActivity implements FragmentMain.OnMenufragListener  {
       
        WebView mWebView;
        private static final Intent SCAN_INTENT = new Intent("com.google.zxing.client.android.SCAN");
       
           @Override
           public void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.activity_main);

            }


           @Override
           public void onMenufrag() {
                        PackageManager packageManager = this.getPackageManager();
                        ResolveInfo resolveInfo = packageManager.resolveActivity(SCAN_INTENT,PackageManager.GET_RESOLVED_FILTER);
                        if(resolveInfo==null) {
                                ((Button)this.findViewById(R.id.buttonScan)).setEnabled(false);
                                ((TextView)this.findViewById(R.id.scanResult)).setText("\nIMPOSSIBLE TO FIND BARCODE SCANNER!\nGET IT ON: http://www.appbrain.com/app/com.google.zxing.client.android");
                        }
               
        }
           
                @Override
                protected void onActivityResult(int requestCode, int resultCode, Intent data) {
                        GoogleResponse googleResponse = new GoogleResponse();
                        PhishTankResponse phishTankResponse = new PhishTankResponse();
                        super.onActivityResult(requestCode, resultCode, data);
                        if (resultCode == Activity.RESULT_OK && requestCode == 0) {
                                Boolean maliciousQRCode = false;
                                Boolean errorPhishTank = false;
                                final String scanResult = data.getStringExtra("SCAN_RESULT");
                                googleResponse = CheckQRCode.queryGoogleSafeBrowsing(scanResult);      
                                if(googleResponse.getResponseCode() == 200 ){
                                        maliciousQRCode = true;
                                }
                                if (googleResponse.getResponseCode() == 204 ){
                                        phishTankResponse = CheckQRCode.queryPhishTank(scanResult);
                                        if(phishTankResponse.getError()==false){
                                        if (phishTankResponse.getValue() == true){
                                                maliciousQRCode = true;}
                                        }
                                        else{
                                                errorPhishTank=true;
                                        }
                                }
                                if (maliciousQRCode==true ){
                                        Intent intent = new Intent(this,ErrorMain.class);
                                        startActivity(intent);
                                        setContentView(R.layout.activity_error);
                                }
                               
                               
                                if (errorPhishTank==true && maliciousQRCode==false){
                                        Intent intent = new Intent(this,ErrorMain.class);
                                        startActivity(intent);
                                        setContentView(R.layout.activity_error);
                                }
                                       
                                if ((googleResponse.getResponseCode() != 200) && (googleResponse.getResponseCode() !=  204)){
                                        ((TextView)this.findViewById(R.id.scanResult)).setText("\nINTERNET CONNECTION \nNOT AVAILABLE");
                                }
                               
                                if (maliciousQRCode == false && (googleResponse.getResponseCode() ==  204) && errorPhishTank==false){
                                        ((TextView)this.findViewById(R.id.scanResult)).setText("\n\t\t\tSAFE QR CODE");
                                        Intent i = new Intent(Intent.ACTION_VIEW);
                                        i.setData(Uri.parse(scanResult));
                                        startActivity(i);
                                }
                        }

                        else {
                                ((TextView)this.findViewById(R.id.scanResult)).setText("\n\t\tCANCELLED CHECK");
                        }
                }

}

e ErrorMain.java che si riferisce a activity_error.xml
Codice (Java): [Seleziona]
package com.example.qrcodesecurity;


import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.webkit.WebView;
import android.widget.TextView;

public class ErrorMain extends FragmentActivity{
       
        WebView mWebView;
       
        @Override
           protected void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.activity_error);
            }

       
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
                GoogleResponse googleResponse = new GoogleResponse();
                PhishTankResponse phishTankResponse = new PhishTankResponse();
                super.onActivityResult(requestCode, resultCode, data);
                        Boolean malware = false;
                        Boolean phishing = false;
                        Boolean errorPhishTank = false;
                        final String scanResult = data.getStringExtra("SCAN_RESULT");
                        googleResponse = CheckQRCode.queryGoogleSafeBrowsing(scanResult);      
                        if(googleResponse.getResponseCode() == 200 ){
                                if (googleResponse.getResponseBody().equals("malware")){
                                        malware = true;
                                }
                                if (googleResponse.getResponseBody().equals("phishing")){
                                        phishing = true;
                                }
                        }
                        if (googleResponse.getResponseCode() == 204 ){
                                phishTankResponse = CheckQRCode.queryPhishTank(scanResult);
                                if(phishTankResponse.getError()==false){
                                if (phishTankResponse.getValue() == true){
                                        phishing = true;}
                                }
                                else{
                                        errorPhishTank=true;
                                }
                        }
                                if (phishing == true){
                                        ((TextView)this.findViewById(R.id.scanResult)).setText("\n\tMALICIOUS QR CODE \n\tATTACK TYPE: PHISHING");
                                }
                                if (malware == true){
                                        ((TextView)this.findViewById(R.id.scanResult)).setText("\n\tMALICIOUS QR CODE \n\tATTACK TYPE: MALWARE");
                                                }
                       
                       
                        if (errorPhishTank==true){
                                ((TextView)this.findViewById(R.id.scanResult)).setText("\nIMPOSSIBLE TO CHECK QR CODE");
                        }

        }


}

Se qualcuno ha del tempo da dedicarmi gliene sarei grato.

Offline lorux

  • Utente junior
  • **
  • Post: 97
  • Respect: +12
    • Google+
    • lor.catalano
    • Mostra profilo
  • Dispositivo Android:
    Galaxy S2
  • Sistema operativo:
    Windows
Re:Applicazione Android con utilizzo fragment
« Risposta #1 il: 19 Marzo 2013, 09:29:08 CET »
0
beh dovresti essere + preciso col problema che hai..che errori dà?

comunque secondo me non ha senso avere 1 fragment per activity,anche perchè mi pare che usi fragment statici nel layout..

se hai problemi di grafica su altri dispositivi controlla meglio i vari layout,magari non usare il relativelayout

Offline cri90

  • Nuovo arrivato
  • *
  • Post: 14
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Corby GT-I5500
  • Sistema operativo:
    Ubuntu 12.10, Windows 7
Re:Applicazione Android con utilizzo fragment
« Risposta #2 il: 19 Marzo 2013, 11:38:52 CET »
0
Il problema principale è che nemmeno mi fa partire l'applicazione sul dispositivo. Va subito in errore.. Sono alle prime armi con android e non so gestire bene i fragment e le activity. Non so come creare delle dipendenze fatte bene. Ho pure letto parecchie guide. Secondo me sbaglio già nell'inizializzazione delle classi che definiscono activity e fragment.

Offline skylong

  • Utente junior
  • **
  • Post: 51
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    S3
Re:Applicazione Android con utilizzo fragment
« Risposta #3 il: 19 Marzo 2013, 17:53:00 CET »
0
Il problema principale è che nemmeno mi fa partire l'applicazione sul dispositivo. Va subito in errore.. Sono alle prime armi con android e non so gestire bene i fragment e le activity. Non so come creare delle dipendenze fatte bene. Ho pure letto parecchie guide. Secondo me sbaglio già nell'inizializzazione delle classi che definiscono activity e fragment.

Potresti copiare il logcat che vediamo a che punto è l'errore??

Offline cri90

  • Nuovo arrivato
  • *
  • Post: 14
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Corby GT-I5500
  • Sistema operativo:
    Ubuntu 12.10, Windows 7
Re:Applicazione Android con utilizzo fragment
« Risposta #4 il: 19 Marzo 2013, 22:03:17 CET »
0
03-19 22:00:29.181: E/AndroidRuntime(13350): Uncaught handler: thread main exiting due to uncaught exception
03-19 22:00:29.341: E/AndroidRuntime(13350): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.qrcodesecurity/com.example.qrcodesecurity.ActivityMain}: android.view.InflateException: Binary XML file line #8: Error inflating class fragment
03-19 22:00:29.341: E/AndroidRuntime(13350):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2496)
03-19 22:00:29.341: E/AndroidRuntime(13350):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2512)
03-19 22:00:29.341: E/AndroidRuntime(13350):    at android.app.ActivityThread.access$2200(ActivityThread.java:119)
03-19 22:00:29.341: E/AndroidRuntime(13350):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1863)
03-19 22:00:29.341: E/AndroidRuntime(13350):    at android.os.Handler.dispatchMessage(Handler.java:99)
03-19 22:00:29.341: E/AndroidRuntime(13350):    at android.os.Looper.loop(Looper.java:123)
03-19 22:00:29.341: E/AndroidRuntime(13350):    at android.app.ActivityThread.main(ActivityThread.java:4363)
03-19 22:00:29.341: E/AndroidRuntime(13350):    at java.lang.reflect.Method.invokeNative(Native Method)
03-19 22:00:29.341: E/AndroidRuntime(13350):    at java.lang.reflect.Method.invoke(Method.java:521)
03-19 22:00:29.341: E/AndroidRuntime(13350):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
03-19 22:00:29.341: E/AndroidRuntime(13350):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
03-19 22:00:29.341: E/AndroidRuntime(13350):    at dalvik.system.NativeStart.main(Native Method)
03-19 22:00:29.341: E/AndroidRuntime(13350): Caused by: android.view.InflateException: Binary XML file line #8: Error inflating class fragment
03-19 22:00:29.341: E/AndroidRuntime(13350):    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:582)
03-19 22:00:29.341: E/AndroidRuntime(13350):    at android.view.LayoutInflater.rInflate(LayoutInflater.java:618)
03-19 22:00:29.341: E/AndroidRuntime(13350):    at android.view.LayoutInflater.inflate(LayoutInflater.java:407)
03-19 22:00:29.341: E/AndroidRuntime(13350):    at android.view.LayoutInflater.inflate(LayoutInflater.java:320)
03-19 22:00:29.341: E/AndroidRuntime(13350):    at android.view.LayoutInflater.inflate(LayoutInflater.java:276)
03-19 22:00:29.341: E/AndroidRuntime(13350):    at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:198)
03-19 22:00:29.341: E/AndroidRuntime(13350):    at android.app.Activity.setContentView(Activity.java:1622)
03-19 22:00:29.341: E/AndroidRuntime(13350):    at com.example.qrcodesecurity.ActivityMain.onCreate(ActivityMain.java:23)
03-19 22:00:29.341: E/AndroidRuntime(13350):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
03-19 22:00:29.341: E/AndroidRuntime(13350):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2459)
03-19 22:00:29.341: E/AndroidRuntime(13350):    ... 11 more
03-19 22:00:29.341: E/AndroidRuntime(13350): Caused by: java.lang.ClassCastException: com.example.qrcodesecurity.ActivityMain@4469c080 must implement OnMenufragListener
03-19 22:00:29.341: E/AndroidRuntime(13350):    at com.example.qrcodesecurity.FragmentMain.onAttach(FragmentMain.java:41)
03-19 22:00:29.341: E/AndroidRuntime(13350):    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:867)
03-19 22:00:29.341: E/AndroidRuntime(13350):    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1066)
03-19 22:00:29.341: E/AndroidRuntime(13350):    at android.support.v4.app.FragmentManagerImpl.addFragment(FragmentManager.java:1168)
03-19 22:00:29.341: E/AndroidRuntime(13350):    at android.support.v4.app.FragmentActivity.onCreateView(FragmentActivity.java:280)
03-19 22:00:29.341: E/AndroidRuntime(13350):    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:558)
03-19 22:00:29.341: E/AndroidRuntime(13350):    ... 20 more


Post unito: 19 Marzo 2013, 22:04:48 CET
premetto che è un'applicazione che dipende dalla libreria Zxing e che si serve dell'applicazione barcode scanner.. deve sostanzialmente mostrare due schermate diverse a seconda della situazione.. deve gestire la sicurezza degli url
« Ultima modifica: 19 Marzo 2013, 22:04:48 CET da cri90, Reason: Merged DoublePost »

Offline lorux

  • Utente junior
  • **
  • Post: 97
  • Respect: +12
    • Google+
    • lor.catalano
    • Mostra profilo
  • Dispositivo Android:
    Galaxy S2
  • Sistema operativo:
    Windows
Re:Applicazione Android con utilizzo fragment
« Risposta #5 il: 19 Marzo 2013, 22:39:37 CET »
0
te lo dice qui
Codice: [Seleziona]
Caused by: java.lang.ClassCastException: com.example.qrcodesecurity.ActivityMain@4469c080 must implement OnMenufragListener

la tua ActivityMain non implementa OnMenufragListener

Offline cri90

  • Nuovo arrivato
  • *
  • Post: 14
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Corby GT-I5500
  • Sistema operativo:
    Ubuntu 12.10, Windows 7
Re:Applicazione Android con utilizzo fragment
« Risposta #6 il: 20 Marzo 2013, 00:03:17 CET »
0
Non so bene come implementare queste dipendenze.. Non riesco ad entrare nell'ottica del funzionamento del fragment. mi potreste dare qualche dritta?

Offline lorux

  • Utente junior
  • **
  • Post: 97
  • Respect: +12
    • Google+
    • lor.catalano
    • Mostra profilo
  • Dispositivo Android:
    Galaxy S2
  • Sistema operativo:
    Windows
Re:Applicazione Android con utilizzo fragment
« Risposta #7 il: 20 Marzo 2013, 00:35:01 CET »
0
hmm ho da poco iniziato a usare i fragment e non li sto implementando come li implementi tu e come nella guida nel forum XD

cmd ho notato che in FragmentMain hai

Codice: [Seleziona]
@Override
           public void onAttach(Activity activity) {
              super.onAttach(activity);
              try {
                 menufragListener = (OnMenufragListener) activity;
              } catch (ClassCastException e) {
                 throw new ClassCastException(activity.toString()+" must implement OnMenufragListener");
              }
           }
cioè lui cerca di castare activity a OnMenufragListener ,non ci riesce e quindi lancia l'eccezione che dà a te,eppure la tua activity effettivamente implementa quell'interfaccia e ha quel metodo..
spe provo a ricreare il progetto

edit: ho copiato paro paro il tuo codice(commentando le parti dove non ho le librerie) e a me l'activity parte :|
« Ultima modifica: 20 Marzo 2013, 00:47:32 CET da lorux »

Offline cri90

  • Nuovo arrivato
  • *
  • Post: 14
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Corby GT-I5500
  • Sistema operativo:
    Ubuntu 12.10, Windows 7
Re:Applicazione Android con utilizzo fragment
« Risposta #8 il: 24 Marzo 2013, 19:07:54 CET »
0
Allora riformulo il problema perchè così magari qualcuno riesce a darmi delle dritte.
Premetto che voglio ottenere un'applicazione che lavori in modalità Portrait sia su telefoni con lo schermo molto piccolo che su tablet. Ho pensato quindi di creare due layout, ognuno dei quali contenga massimo un fragment.
Però un layout deve lavorare alternando a seconda dei risultati ottenuti dall'applicazione due fragment (sempre uno per volta). Vi faccio l'esempio:
Se ho scansionato un QR Code affidabile devo ottenere la schermata celeste con scritto SAFE QR CODE che allego (che è la stessa che mi appare all'apertura dell'applicazione ma con una stampa in più), mentre con QR Code Malevolo ottendo la schermata rossa più una stampa, anche questa è allegata.
L'altro layout mostra solo un fragment è appare sono in un certo caso eccezionale.
Quindi i due layout sono:
activity_main.xml
Codice (XML): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="fill_parent"
   android:layout_height="fill_parent"
   android:orientation="vertical" >
       
    <FrameLayout
       android:id="@+id/fragment"
       android:layout_width="fill_parent"
       android:layout_height="fill_parent"
       />
               
</LinearLayout>

l'altro layout è:
activityerror_main.xml
Codice (XML): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:orientation="vertical" >
   
        <FrameLayout
       android:id="@+id/error"
       android:layout_width="fill_parent"
       android:layout_height="fill_parent"
       />
   

</LinearLayout>

Due fragment da associare al primo layout sono:
frag_main.xml
Codice (XML): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:background="@drawable/celes" >
   
    <ImageButton
       android:id="@+id/buttonPrag"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:layout_alignParentBottom="true"
       android:layout_alignParentRight="true"
       android:layout_marginRight="14dp"
       android:onClick="openPrag"
       android:src="@drawable/prag" />

    <ImageButton
       android:id="@+id/buttonUnica"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:layout_alignParentBottom="true"
       android:layout_marginRight="17dp"
       android:onClick="openUnica"
       android:src="@drawable/unica" />

    <ImageButton
       android:id="@+id/buttonDiee"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:layout_alignParentBottom="true"
       android:layout_centerHorizontal="true"
       android:onClick="openDiee"
       android:src="@drawable/diee" />

    <ImageButton
       android:id="@+id/buttonScan"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:layout_below="@+id/webview"
       android:layout_marginTop="32dp"
       android:layout_toLeftOf="@+id/buttonPrag"
       android:includeFontPadding="false"
       android:onClick="onScan"
       android:src="@drawable/scan" />

    <TextView
       android:id="@+id/scanResult"
       android:layout_width="fill_parent"
       android:layout_height="wrap_content"
       android:layout_alignParentLeft="true"
       android:layout_below="@+id/buttonScan"
       android:layout_marginTop="20dp"
       android:textColor="#000000"
       android:textColorHint="#000000"
       android:textColorLink="#000000"
       android:textSize="24sp"
       android:textStyle="bold|italic"
       android:typeface="sans" />

    <Button
       android:id="@+id/exit"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:layout_alignParentLeft="true"
       android:layout_alignParentTop="true"
       android:onClick="onExit"
       android:text="X" />

</RelativeLayout>

e subfrag_main.xml
Codice (XML): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:background="@drawable/warning" >
   
    <Button
       android:id="@+id/buttonNew"
       android:layout_width="fill_parent"
       android:layout_height="wrap_content"
       android:layout_alignParentBottom="true"
       android:layout_alignParentLeft="true"
       android:layout_marginBottom="22dp"
       android:layout_marginLeft="10dp"
       android:layout_marginRight="10dp"
       android:onClick="Intent.ACTION_VIEW"
       android:text="NEW SCAN" />

    <Button
       android:id="@+id/buttonConnection"
       android:layout_width="fill_parent"
       android:layout_height="wrap_content"
       android:layout_above="@+id/buttonNew"
       android:layout_alignParentLeft="true"
       android:layout_marginBottom="16dp"
       android:layout_marginLeft="10dp"
       android:layout_marginRight="10dp"
       android:onClick="Intent.ACTION_VIEW"
       android:text="OPEN URL ANYWAY" />

    <TextView
       android:id="@+id/scanResult"
       android:layout_width="fill_parent"
       android:layout_height="wrap_content"
       android:layout_alignParentLeft="true"
       android:layout_below="@+id/exit"
       android:freezesText="false"
       android:includeFontPadding="false"
       android:selectAllOnFocus="false"
       android:textColor="#000000"
       android:textColorHint="#000000"
       android:textColorLink="#000000"
       android:textSize="24sp"
       android:textStyle="bold|italic"
       android:typeface="sans" />

        <Button
       android:id="@+id/exit"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:layout_alignParentLeft="true"
       android:layout_alignParentTop="true"
       android:onClick="onExit"
       android:text="X" />

</RelativeLayout>

Il secondo layout può visualizzare solo il seguente fragment:
fragerror_main.xml
Codice (XML): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:background="@drawable/celestial" >
   
    <Button
           android:id="@+id/exit"
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:layout_alignParentLeft="true"
           android:layout_alignParentTop="true"
           android:onClick="onExit"
           android:text="X" />

        <TextView
           android:id="@+id/scanResult"
           android:layout_width="fill_parent"
           android:layout_height="wrap_content"
           android:layout_alignParentLeft="true"
           android:layout_below="@+id/exit"
           android:layout_marginTop="17dp"
           android:linksClickable="true"
           android:textColor="#000000"
           android:textColorHint="#000000"
           android:textColorLink="#000000"
           android:textSize="24sp"
           android:textStyle="bold|italic"
           android:typeface="sans" />

        <Button
           android:id="@+id/download"
           android:layout_width="fill_parent"
           android:layout_height="wrap_content"
           android:layout_alignParentBottom="true"
           android:layout_alignParentLeft="true"
           android:textSize="20sp"
           android:layout_marginBottom="39dp"
           android:gravity="center"
           android:onClick="onDownload"
           android:text="Press to download Barcode Scanner" />

   
</RelativeLayout>

Il mio problema sta nel fatto che non so come strutturale le classi java per i fragment e per l'activity.
Tipo la classe activity deve dire:
Tu istanzia questo layout ma se succede una determinata cosa mi metti l'altro layout che ha un unico fragment fisso..
E poi non so come istanziare i due fragment volta per volta a seconda di quello che succede ne primo layout.

Post unito: 25 Marzo 2013, 14:56:24 CET
Nessuno riesce a darmi una mano?
« Ultima modifica: 25 Marzo 2013, 14:56:24 CET da cri90, Reason: Merged DoublePost »

Offline cri90

  • Nuovo arrivato
  • *
  • Post: 14
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Corby GT-I5500
  • Sistema operativo:
    Ubuntu 12.10, Windows 7
Re:Applicazione Android con utilizzo fragment
« Risposta #9 il: 27 Marzo 2013, 20:23:17 CET »
0
hmm ho da poco iniziato a usare i fragment e non li sto implementando come li implementi tu e come nella guida nel forum XD

cmd ho notato che in FragmentMain hai

Codice: [Seleziona]
@Override
           public void onAttach(Activity activity) {
              super.onAttach(activity);
              try {
                 menufragListener = (OnMenufragListener) activity;
              } catch (ClassCastException e) {
                 throw new ClassCastException(activity.toString()+" must implement OnMenufragListener");
              }
           }
cioè lui cerca di castare activity a OnMenufragListener ,non ci riesce e quindi lancia l'eccezione che dà a te,eppure la tua activity effettivamente implementa quell'interfaccia e ha quel metodo..
spe provo a ricreare il progetto

edit: ho copiato paro paro il tuo codice(commentando le parti dove non ho le librerie) e a me l'activity parte :|


Ho risolto il problema precedente. Ora ne ho un altro. Quando dentro il mio fragmente chiamo l'intent con il click sul pulsante, vorrei che i risultati dell'intent vengano resi all'activity principale e che sia questa a continuare a gestire l'applicazione. Come faccio?

Offline kubrick89

  • Nuovo arrivato
  • *
  • Post: 9
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Nexus
  • Play Store ID:
    JabbuDev
  • Sistema operativo:
    Windows 7
Re:Applicazione Android con utilizzo fragment
« Risposta #10 il: 27 Marzo 2013, 20:53:16 CET »
0
Quando premi il pulsante devi eseguire l'activity usando startActivityForResult(Intent, int) e non startActivity(Intent)
« Ultima modifica: 27 Marzo 2013, 20:55:03 CET da kubrick89 »

Offline cri90

  • Nuovo arrivato
  • *
  • Post: 14
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Corby GT-I5500
  • Sistema operativo:
    Ubuntu 12.10, Windows 7
Re:Applicazione Android con utilizzo fragment
« Risposta #11 il: 27 Marzo 2013, 21:14:26 CET »
0
Quando premi il pulsante devi eseguire l'activity usando startActivityForResult(Intent, int) e non startActivity(Intent)

Facendo questo in automatico ottengo i risultati sull'activity dati da fragment? o devo prima inserirli in qualche variabile e passarli?

Post unito: 27 Marzo 2013, 21:56:30 CET
non badare al codice java che c'è sopra. Io quando faccio clic su scan attivo già startActivityForResult(Intent, int). solamente che io eseguo questo dentro il fragmente. E vorrei questo risultato sull'activitu primaria però..

Post unito: 28 Marzo 2013, 11:22:05 CET
Ho risolto, grazie a tutti lo stesso
« Ultima modifica: 28 Marzo 2013, 11:22:05 CET da cri90, Reason: Merged DoublePost »