Foro de elhacker.net

Programación => Java => Mensaje iniciado por: TickTack en 26 Mayo 2020, 13:14 pm



Título: Problema con una App
Publicado por: TickTack en 26 Mayo 2020, 13:14 pm

Hola a todos,
quería hacer un control de pestañas, en donde se cargue en cada pestaña un Activity con su xml.
Pero al abrir la App se me crashea, y no se por qué.
En MainActivity.java está este código:
Código:
package com.mycompany.myapp;

import android.app.*;
import android.os.*;
import android.app.TabActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.TabHost;
import android.widget.Toast;

public class MainActivity extends Activity
{
   

@Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

TabHost tabHost = (TabHost) findViewById(android.R.id.tabhost); // initiate TabHost
        TabHost.TabSpec spec; // Reusable TabSpec for each tab
        Intent intent; // Reusable Intent for each tab

        spec = tabHost.newTabSpec("home"); // Create a new TabSpec using tab host
        spec.setIndicator("HOME"); // set the “HOME” as an indicator
        // Create an Intent to launch an Activity for the tab (to be reused)
        intent = new Intent(this, personalActivity.class);
        spec.setContent(intent);
        tabHost.addTab(spec);

        // Do the same for the other tabs

        spec = tabHost.newTabSpec("About"); // Create a new TabSpec using tab host
        spec.setIndicator("ABOUT"); // set the “ABOUT” as an indicator
        // Create an Intent to launch an Activity for the tab (to be reused)
        intent = new Intent(this, chatActivity.class);
        spec.setContent(intent);
        tabHost.addTab(spec);
        //set tab which one you want to open first time 0 or 1 or 2
        tabHost.setCurrentTab(1);
        tabHost.setOnTabChangedListener(new TabHost.OnTabChangeListener() {
@Override
public void onTabChanged(String tabId) {
// display the name of the tab whenever a tab is changed
Toast.makeText(getApplicationContext(), tabId, Toast.LENGTH_SHORT).show();
}
});

    }


}
En el respectivo main.xml está este código:
Código:
<?xml version="1.0" encoding="UTF-8"?>
<TabHost xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/tabhost"
android:layout_width="fill_parent"
android:layout_height="fill_parent">

<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">

<FrameLayout
android:id="@android:id/tabcontent"
android:layout_width="fill_parent"
android:layout_height="0dip"
android:layout_weight="1" />

<TabWidget
android:id="@android:id/tabs"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="-4dp"
android:layout_weight="0" />

</LinearLayout>

</TabHost>
También me encargue de que cada Activity, que se cargará en cada pestaña, cargue su xml.
Miren:
personalActivity.java:
Código:
package com.mycompany.myapp;

import android.app.*;
import android.os.*;
import android.widget.Spinner;
import android.widget.ArrayAdapter;
import java.util.Locale;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import android.content.res.*;
import android.content.SharedPreferences;
import android.content.Context;
import android.widget.*;
import java.security.SecureRandom;

public class personalActivity extends Activity
{
    static final String AB = "0123456789abcdefghijklmnopqrstuvwxyz";
static SecureRandom rnd = new SecureRandom();

private Spinner spinner1,citizenship, spinner3;
private EditText editText1, editText2, editText3;

@Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.personal);

spinner1 = (Spinner) findViewById(R.id.spinner1);
        String []opciones={getString(R.string.secreto),getString(R.string.masculino),getString(R.string.femenino)};
        ArrayAdapter <String>adapter = new ArrayAdapter<String>(this,android.R.layout.simple_spinner_item, opciones);
        spinner1.setAdapter(adapter);

Locale[] locale = Locale.getAvailableLocales();
ArrayList<String> countries = new ArrayList<String>();
String country;
for( Locale loc : locale ){
country = loc.getDisplayCountry();
if( country.length() > 0 && !countries.contains(country) ){
countries.add( country );
}
}
Collections.sort(countries, String.CASE_INSENSITIVE_ORDER);
countries.add(0, getString(R.string.secreto));
citizenship = (Spinner)findViewById(R.id.citizenship);
ArrayAdapter<String> adapter2 = new ArrayAdapter<String>(this,android.R.layout.simple_spinner_item, countries);
citizenship.setAdapter(adapter2);

List age = new ArrayList<Integer>();
for (int i = 1; i <= 100; i++) {
age.add(Integer.toString(i));
}
age.add(0, getString(R.string.secreto));
ArrayAdapter<Integer> spinnerArrayAdapter = new ArrayAdapter<Integer>(
this, android.R.layout.simple_spinner_item, age);
spinner3 = (Spinner)findViewById(R.id.age);
spinner3.setAdapter(spinnerArrayAdapter);

editText1=(EditText)findViewById(R.id.mainEditText2);
editText2=(EditText)findViewById(R.id.mainEditText3);
editText3=(EditText)findViewById(R.id.mainEditText4);

SharedPreferences prefe=getSharedPreferences("datos", Context.MODE_PRIVATE);
        if(prefe.getString("usuario","").length()==0)
{
editText1.setText("rs "+randomString(5));
}
else
{
editText1.setText(prefe.getString("usuario",""));
}
spinner1.setSelection(prefe.getInt("sexo",-1));
citizenship.setSelection(prefe.getInt("pais",-1));
editText2.setText(prefe.getString("estado",""));
editText3.setText(prefe.getString("personal",""));
spinner3.setSelection(prefe.getInt("edad",-1));

    }

@Override
protected void onStop()
{
SharedPreferences preferencias=getSharedPreferences("datos",Context.MODE_PRIVATE);
        SharedPreferences.Editor editor=preferencias.edit();
        editor.putString("usuario", editText1.getText().toString());
editor.putInt("sexo", spinner1.getSelectedItemPosition());
editor.putInt("pais", citizenship.getSelectedItemPosition());
editor.putString("estado", editText2.getText().toString());
editor.putString("personal", editText3.getText().toString());
editor.putInt("edad", spinner3.getSelectedItemPosition());
        editor.commit();
        finish();
super.onStop();
}

String randomString( int len ){
StringBuilder sb = new StringBuilder( len );
for( int i = 0; i < len; i++ )
sb.append( AB.charAt( rnd.nextInt(AB.length()) ) );
return sb.toString();
}
}
personal.xml:
Código:
<?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">

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hashlink:"
android:textSize="29sp"
android:id="@+id/mainTextView1"/>

<EditText
android:layout_width="wrap_content"
android:ems="12"
android:layout_height="wrap_content"
android:layout_below="@id/mainTextView1"
android:id="@+id/mainEditText1"/>

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/usuario"
android:layout_below="@id/mainEditText1"
android:layout_marginTop="40dp"
android:textStyle="bold"
android:id="@+id/mainTextView2"/>

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/sexo"
android:layout_below="@id/mainTextView2"
android:layout_marginTop="40dp"
android:textStyle="bold"
android:id="@+id/mainTextView3"/>

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/pais"
android:layout_below="@id/mainTextView3"
android:layout_marginTop="40dp"
android:textStyle="bold"
android:id="@+id/mainTextView4"/>

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/ciudad"
android:layout_below="@id/mainTextView4"
android:layout_marginTop="40dp"
android:textStyle="bold"
android:id="@+id/mainTextView5"/>

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/personal"
android:layout_below="@id/mainTextView5"
android:layout_marginTop="40dp"
android:textStyle="bold"
android:id="@+id/mainTextView6"/>

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/edad"
android:layout_below="@id/mainTextView6"
android:layout_marginTop="40dp"
android:textStyle="bold"
android:id="@+id/mainTextView7"/>

<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/conectar"
android:layout_below="@id/mainTextView7"
android:layout_marginTop="50dp"
android:layout_marginLeft="120dp"/>

<EditText
android:layout_width="wrap_content"
android:ems="10"
android:layout_height="wrap_content"
android:layout_toRightOf="@id/mainTextView6"
android:layout_marginTop="110dp"
android:id="@+id/mainEditText2"/>

<Spinner
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@id/mainTextView6"
android:layout_marginTop="180dp"
android:id="@+id/spinner1"/>

<Spinner
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@id/mainTextView6"
android:layout_marginTop="240dp"
android:id="@+id/citizenship"/>

<EditText
android:layout_width="wrap_content"
android:ems="10"
android:layout_height="wrap_content"
android:layout_toRightOf="@id/mainTextView6"
android:layout_marginTop="285dp"
android:id="@+id/mainEditText3"/>

<EditText
android:layout_width="wrap_content"
android:ems="10"
android:layout_height="wrap_content"
android:layout_toRightOf="@id/mainTextView6"
android:layout_marginTop="342dp"
android:id="@+id/mainEditText4"/>

<Spinner
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@id/mainTextView6"
android:layout_marginTop="418dp"
android:id="@+id/age"/>

</RelativeLayout>
chatActivity.java:
Código:
package com.mycompany.myapp;

import android.app.*;
import android.os.*;

public class chatActivity extends Activity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
        setContentView(R.layout.chat);
}
}
chat.xml:
Código:
<?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"/>
También agregue las actividades en AndroidManifest:
Código:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.mycompany.myapp" >

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name"
android:configChanges="locale">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
<activity
android:name=".personalActivity"
android:label="@string/title_activity_my"></activity>
<activity
android:name=".chatActivity"
android:label="@string/title_activity_about"></activity>
    </application>

</manifest>
Pero a pesar de todo esto me larga estos errores:
05-26 13:10:55.501 8924 8924 E     AndroidRuntime                               FATAL EXCEPTION: main
05-26 13:10:55.501 8924 8924 E     AndroidRuntime                               Process: com.mycompany.myapp, PID: 8924
05-26 13:10:55.501 8924 8924 E     AndroidRuntime                               java.lang.RuntimeException: Unable to start activity ComponentInfo{com.mycompany.myapp/com.mycompany.myapp.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TabWidget.addView(android.view.View)' on a null object reference
05-26 13:10:55.501 8924 8924 E     AndroidRuntime                               at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2864)
05-26 13:10:55.501 8924 8924 E     AndroidRuntime                               at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2961)
05-26 13:10:55.501 8924 8924 E     AndroidRuntime                               at android.app.ActivityThread.-wrap11(Unknown Source:0)
05-26 13:10:55.501 8924 8924 E     AndroidRuntime                               at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1657)
05-26 13:10:55.501 8924 8924 E     AndroidRuntime                               at android.os.Handler.dispatchMessage(Handler.java:106)
05-26 13:10:55.501 8924 8924 E     AndroidRuntime                               at android.os.Looper.loop(Looper.java:165)
05-26 13:10:55.501 8924 8924 E     AndroidRuntime                               at android.app.ActivityThread.main(ActivityThread.java:6774)
05-26 13:10:55.501 8924 8924 E     AndroidRuntime                               at java.lang.reflect.Method.invoke(Native Method)
05-26 13:10:55.501 8924 8924 E     AndroidRuntime                               at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:477)
05-26 13:10:55.501 8924 8924 E     AndroidRuntime                               at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:809)
05-26 13:10:55.501 8924 8924 E     AndroidRuntime                               Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TabWidget.addView(android.view.View)' on a null object reference
05-26 13:10:55.501 8924 8924 E     AndroidRuntime                               at android.widget.TabHost.addTab(TabHost.java:234)
05-26 13:10:55.501 8924 8924 E     AndroidRuntime                               at com.mycompany.myapp.MainActivity.onCreate(MainActivity.java:32)
05-26 13:10:55.501 8924 8924 E     AndroidRuntime                               at android.app.Activity.performCreate(Activity.java:7154)
05-26 13:10:55.501 8924 8924 E     AndroidRuntime                               at android.app.Activity.performCreate(Activity.java:7145)
05-26 13:10:55.501 8924 8924 E     AndroidRuntime                               at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1225)
05-26 13:10:55.501 8924 8924 E     AndroidRuntime                               at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2817)
05-26 13:10:55.501 8924 8924 E     AndroidRuntime                               ... 9

Alguien me puede ayudar, por favor?

Gracias y saludos


Título: Re: Problema con una App
Publicado por: rub'n en 2 Junio 2020, 17:36 pm
probaste con tabHost.setup() en tu MainActivity ?, justo después del casting de

Código
  1. TabHost tabHost = (TabHost) findViewById(android.R.id.tabhost);


Título: Re: Problema con una App
Publicado por: TickTack en 5 Junio 2020, 11:33 am
Hola rub'n,

si, ya probé con el método setup() pero siguió sin funcionar...

Pero al trabajar con TabLayout en vez de con TabHost me funcionó. Creo que se debe a que TabHost es viejo...


Gracias y saludos